Я играю с арифметикой с плавающей запятой, и я столкнулся с чем-то, что нужно объяснить.C - добавление двух нормальных чисел с плавающей запятой с одинарной точностью, не может получить результат до бесконечности
При установке округления режима «к нулю», иначе:
fesetround(FE_TOWARDZERO);
И добавляя различные виды обычных положительных чисел, я никогда не могу достичь бесконечности.
Однако из ieee 745 известно, что переполнение до бесконечности может быть результатом добавления конечных чисел.
Например:
#include <fenv.h>
#include <stdio.h>
float hex2float (int hex_num) {
return *(float*)&hex_num;
}
void main() {
int a_int = 0x7f7fffff; // Maximum finite single precision number, about 3.4E38
int b_int = 0x7f7fffff;
float a = hex2float(a_int);
float b = hex2float(b_int);
float res_add;
fesetround(FE_TOWARDZERO); // need to include fenv.h for that
printf("Calculating... %+e + %+e\n",a,b);
res_add = a + b;
printf("Res = %+e\n",res_add);
}
Однако, если я изменить режим округления на что-то другое, я мог бы получить + INF в качестве ответа.
Может кто-нибудь объяснить это?
Я понятия не имею, что делает 'hex2float', поскольку вы даже не упоминаете библиотеку, которую используете. Но я уверен, что он не принимает 'int's .. –
@EugeneSh .: определение' hex2float' находится в размещенном коде. – Dolda2000
Ох. пропустил его. Строгое нарушение псевдонимов. –