Linux と Windows の両方で gcc と MSVC を試してみましたが、驚くほど同じ結果が得られました。
modf(+INFINITY) は正確なゼロを返します (結果の double のバイナリ表現では 0x0000000000000000、float では 0x00000000)
ただし、modf(-INFINITY) は 6.3e-322 (float バージョンでは 1.793662034335766e-43) を返します (結果の double のバイナリ表現では 0x0000000000000080、float では 0x00000080)
質問:
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;
}