Я играю с арифметикой с плавающей запятой, и я столкнулся с чем-то, что нуждается в объяснении.
При установке режима округления на «к нулю», иначе:
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.. - person Eugene Sh.   schedule 25.05.2016hex2float
находится в опубликованном коде. - person Dolda2000   schedule 25.05.2016hex
. - person Eugene Sh.   schedule 25.05.2016int2float()
, так как не существует типа данныхhex
. - person alk   schedule 25.05.2016MAXFLOAT
, как иa
иb
. - person Dolda2000   schedule 25.05.2016FE_TONEAREST
должно также иметьMAXFLOAT + MAXFLOAT == MAXFLOAT
, поскольку любой конечный результат будет математически ближе кMAXFLOAT
, чем к бесконечности. ;) - person Dolda2000   schedule 25.05.2016float a = FLT_MAX;
позволило бы избежать отвлекающего обсужденияhex2float()
. - person chux - Reinstate Monica   schedule 25.05.2016