4

私のコードは非常に単純です

double d = 405, g = 9.8, v = 63;
double r = d * g / (v * v);
printf("%s\n",(r>1.0)?"GT":"LE");

これが私の結果です

  • g++-mingw32-v4.8.1: LE (結果は確かに EQ です)
  • ubuntuのg ++​​:GT(この結果は私の友人からのものです。手元にLinuxがありません)
  • VC++ 11 : GT
  • C# (.Net 4.5) : GT
  • Python v2.7.3 :GT (これも私の友人からのものです)
  • Haskell (GHCi v7.6.3) : GT

g++-mingw、vc++、c#、haskell はすべて i7-2630QM を搭載したマシンで実行されています

Python-win32 バージョンは私の友人から入手したもので、彼は g++-mingw-3.4.2 からLEも取得しています。

そして、ubuntuバージョンは別の友人からのものです...

g++ だけが LE を提供し、他はすべて GT です。

どちらが間違っているか、g ++かそれ以外かを知りたいだけです。

または、IEEE 754 では、GT または LE のどちらである必要がありますか?

4

5 に答える 5

4

IEEE 754 64 ビット バイナリの結果は GT です。

9.8 を囲んで正確に表現できる 2 つの値は次のとおりです。

9.7999999999999989341858963598497211933135986328125
9.800000000000000710542735760100185871124267578125

2 番目は 9.8 に近いため、通常の丸めモードで選択する必要があります。これは 9.8 よりわずかに大きく、実数演算で生成された 3969.0000000000045474735088646411895751953125 よりもわずかに大きい積になります。doubleへの変換は、乗算vと同様に正確です。v*v結果は、3969 による 3969 よりわずかに大きい数の除算です。

于 2013-09-17T04:32:36.833 に答える
1

小数から 2 進分数への変換は、小数が 0.5、0.25、... などの 2 進分数で合計できる場合にのみ正確です。

例の数値 9.8 には分数 0.8 が含まれています。これは、2 進数システムを使用して正確な分数として表すことはできません。したがって、小数を表す精度に応じて、コンパイラが異なれば結果も異なります。

数値 9.75 を使用してプログラムを実行すると、すべてのコンパイラが同じ結果を返します。

0.75 = 0.25 + 0.125 = 2 -2 + 2 -3

したがって、数値 9.75 は、2 進数の分数を使用して正確に表すことができます。

于 2013-09-17T03:28:29.090 に答える
0

あなたの質問に答えるには: 式は「等しい」と評価される必要があるため、テストr>1.0は偽である必要があり、出力される結果は"LE".

実際には、 のような数値を9.8浮動小数点数として正確に表すことができないという問題に直面しています (これがなぜそうであるかを説明するための優れたリンクが Web 上に何百もあります)。正確な計算が必要な場合は、整数を使用する必要があります。またはbigDecimal。またはそのようなこと。

于 2013-09-17T03:21:22.723 に答える