2

なぜ「2=」の出力が驚きの結果をもたらすのか、光を当ててください。この場合の double の問題は何ですか。

double 値の除算に関する制約。

C ++でそのようなことを回避するオプションはありますか.

#include<iostream.h>
#include<iomanip.h>
#include<math.h>
int main()
{
    double d1,d2,d3,d4,d5;
double d = 0.010000;

d1 = 1000000.28;
d2 = 10000000.28;
d3 = 100000000.28;
d4 = 1000000000.28;
d5 = 10000000000.28;

cout.precision(15);

cout<<"1="<<floor(d1/d)<<endl;
cout<<"2="<<floor(d2/d)<<endl;
cout<<"3="<<floor(d3/d)<<endl;
cout<<"4="<<floor(d4/d)<<endl;
cout<<"5="<<floor(d5/d)<<endl;

return 0;
  }

 o/p
 ====
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;
4

2 に答える 2

7

まず、プログラムからの出力は、質問に書いたものとは異なります。出力は次のとおりです。

1=100000028
2=1000000027
3=10000000028
4=100000000028
5=1000000000028

いいえ:

1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;

第二に、あなたが書くときdouble d = 0.010000d.01に設定されていません。として表現できる近い値に設定されますdouble。(適切な C++ 実装では、表現可能な最も近い値に設定されます。) C++ 実装でdoubleは、IEEE-754 64 ビット バイナリ浮動小数点値である可能性が最も高く、.01 に最も近い表現可能な値は 0.0100000000000000020816681711721685132943093776702880859375 です。

同様に、 と書くd2 = 10000000.28と、d2 は 10000000.28 に設定されません。最も近い表現可能な値は 10000000.27999999932944774627685546875 です。

これらを割ると、およそ 1000000028 よりわずかに小さい数値が得られます。 に丸められた除算の結果は、double1000000027.99999988079071044921875 です。の を取るfloorと、分数が切り捨てられ、1000000027 が残ります。

これらの問題を回避または処理するには、浮動小数点演算および実行する特定の計算に関する知識が必要です。この場合、 を使用する理由を知る必要がありますfloor

于 2013-07-29T15:26:01.190 に答える