0

在 Linux 和 Windows 上都在 gcc 和 MSVC 上进行了尝试,结果非常相似:

modf(+INFINITY) 返回精确的零(0x0000000000000000 以二进制表示的结果双精度,0x00000000 表示浮点数)

但是 modf(-INFINITY) 返回 6.3e-322 (浮点版本为 1.793662034335766e-43)(结果双精度的二进制表示为 0x0000000000000080,浮点数为 0x00000080)

问题:

  1. 为什么在第二种情况下会有一个很小的非零值?

  2. 计算无穷大的小数部分是否有任何标准的预期行为?

代码示例:

#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;
}
4

1 回答 1

1

0x00..80在小端平台上是负零的表示,而不是你在那里的任何东西。

modf对于符合IEC 60559 浮点运算的 C 实现,必须返回负零。从 C99 §F.9.3.12 modf 功能

modf(±∞, iptr)返回 ±0 并将 ±∞ 存储在 iptr 指向的对象中。

于 2013-01-05T14:02:07.303 回答