2016-03-30 13 views
1

私はちょうど怒鳴る++コードCの数行を持っている:解析ロングとダブル

long re = 103491683; 
    double temp = (double)re * (double)re; 
    cout<<"\n"<<"double * double = \t"<<(long)temp; 
    long temp2 = re * re; 
    cout<<"\n"<<"long * long = \t\t"<<temp2; 

、それは2つの異なる値を返します:私が起こるかを理解することはできません

double * double = 10710528450172488 
    long * long =  10710528450172489 

、私が上でこのバグがありましたjavaと私もCで試した+ +とそれは問題です。助けてください(私の貧しい人の英語のために申し訳ありません)

+2

*解析*はどこですか? – Biffen

+0

http://stackoverflow.com/questions/14265785/why-does-multiplying-two-large-double-numbers-give-a-wrong-result – Mourad

+0

[double型の整数を表す](http://stackoverflow.com/ q/759201/995714)、[精度の損失 - int - > floatまたはdouble](http://stackoverflow.com/q/2781086/995714) –

答えて

0

doubleタイプは精度が52バイナリビットで、その他のビットは指数を格納するものと符号を格納するものです。 longタイプ(ほとんどの64ビットシステムで)は63ビットの精度を持ち、1つは符号を格納します。 double * double計算では、最下位ビットが失われています。

は、この例ではより正確にhttps://en.wikipedia.org/wiki/IEEE_floating_point

を参照してください:https://en.wikipedia.org/wiki/Double-precision_floating-point_format

0

ダブルスがあるため数が内部的に保存されているかの不正確さの一定量を持っています。ダブルスで数学演算を行う場合、この不正確さを複合することができます。あなたのコードが小数点以下を扱えるようにする必要があり、これが許容できない量のエラーである場合は、より大きい10進数を許すライブラリの使用を検討してください。 reのすべての可能な値が常に整数になる場合、長いバージョンは正常に動作するはずです。

1

doubleの番号には64ビットの記憶領域があります。そのうち64は、符号を格納するために1が使用され、指数には11が格納され、10進数には53が格納されます。つまり、到達可能な最大精度は、15.95小数点以下53 * log10(2)です。

数字10,710,528,450,172,489は小数点17桁で、doubleに到達できる精度をわずかに上回ります。

64ビットシステムに署名longに達することができる最大数は、2^63である - あなたが持っている数よりも多い= 9,223,372,036,854,775,807 1。