2013-01-05 57 views
0

試戴gcc和MSVC,既在Linux和Windows,顯着相同的結果:MODF()爲負無窮大返回非零輸入

MODF(+ INFINITY)返回精確零(0x0000000000000000在所得的二進制表示雙,00000000浮法)

但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; 
} 
+0

你能發佈重現此代碼嗎? (無法在此處顯示) – Mat

+0

請使用標記下的編輯鏈接將其添加到您的問題中(並使用代碼格式選項)。代碼在評論中無法閱讀。你也需要解釋這些FL類型和常量究竟是什麼。 – Mat

+0

'modf'有兩個參數。請提供確切的代碼,不會給出您期望的結果。 –

回答

1

0x00..80在little-endian的平臺是負零的表示,而不是不管你在那裏。

modf對於符合IEC 60559浮點運算的C實現必須返回負零。從C99§F.9.3.12的MODF功能

modf(±∞, iptr)返回±0和存儲±∞的目的是通過IPTR指向。