在Linux和Windows上尝试使用gcc和MSVC,结果非常相似:
modf(+ INFINITY)返回精确零(结果double的二进制表示形式为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;
}
答案 0 :(得分:1)
0x00..80
是负零的表示,而不是你在那里的任何东西。
modf
必须返回负零。从C99§F.9.3.12 modf函数:
modf(±∞, iptr)
返回±0并在iptr指向的对象中存储±∞。