modf()为负无穷大输入返回非零值

时间:2013-01-05 13:16:13

标签: visual-c++ gcc math.h

在Linux和Windows上尝试使用gcc和MSVC,结果非常相似:

modf(+ INFINITY)返回精确零(结果double的二进制表示形式为0x0000000000000000,浮点数为0x00000000)

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

问题:

  1. 为什么在第二种情况下会出现微小的非零值?

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

  3. 代码示例:

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

1 个答案:

答案 0 :(得分:1)

在小端平台上的

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

对于符合 IEC 60559浮点运算的C实现,

modf必须返回负零。从C99§F.9.3.12 modf函数

  

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