在 Linux 和 Windows 上都在 gcc 和 MSVC 上进行了尝试,结果非常相似:
modf(+INFINITY) 返回精确的零(0x0000000000000000 以二进制表示的结果双精度,0x00000000 表示浮点数)
但是 modf(-INFINITY) 返回 6.3e-322 (浮点版本为 1.793662034335766e-43)(结果双精度的二进制表示为 0x0000000000000080,浮点数为 0x00000080)
问题:
为什么在第二种情况下会有一个很小的非零值?
计算无穷大的小数部分是否有任何标准的预期行为?
代码示例:
#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{
float f1;
float f1a;
double f2;
double f2a;
f1 = modff(-INFINITY,&f1a);
f2 = modf(-INFINITY,&f2a);
//Dump into file to easily see the bits
FILE * f = fopen("a","wb");
fwrite(&f1,4,1,f);
fwrite(&f2,8,1,f);
fclose(f);
return 0;
}