gcc和MSVC在Linux和Windows上进行了尝试,结果非常相似:
modf(+无穷大)返回精确的零(0x0000000000000000在二进制表示中得到的结果为双,0x00000000表示浮点数)
但是modf(-INFINITY)返回6.3e-322 (浮点数版本为1.793662034335766e-43)(0x000000000080以二进制表示形式表示结果双,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;
}发布于 2013-01-05 14:02:07
在一个小终端平台上的0x00..80是负零的表示,而不是上面的任何东西。
对于符合IEC 60559浮点算法的C实现,modf必须返回负零.来自C99§F.9.3.12的modf函数
modf(±∞, iptr)返回±0,并在iptr指向的对象中存储±∞。
https://stackoverflow.com/questions/14172129
复制相似问题