0

Linux と Windows の両方で gcc と MSVC を試してみましたが、驚くほど同じ結果が得られました。

modf(+INFINITY) は正確なゼロを返します (結果の double のバイナリ表現では 0x0000000000000000、float では 0x00000000)

ただし、modf(-INFINITY) は 6.3e-322 (float バージョンでは 1.793662034335766e-43) を返します (結果の double のバイナリ表現では 0x0000000000000080、float では 0x00000080)

質問:

  1. 2 番目のケースにゼロ以外の小さな値があるのはなぜですか?

  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リトルエンディアンのプラットフォームでは、そこにあるものではなく、負のゼロの表現です。

modfIEC 60559 浮動小数点演算に準拠する C 実装では、負のゼロを返す必要があります。C99 §F.9.3.12 からmodf 関数:

modf(±∞, iptr)±0 を返し、iptr が指すオブジェクトに ±∞ を格納します。

于 2013-01-05T14:02:07.303 に答える