2016-09-21 24 views
0
long long sum; 
sum=pow(10,19); 
cout<<sum; 

コードの上の暗黙の定数変換でオーバーフローがエラーを与える:C++:<strong>C++</strong>で[-Woverflow]

overflow in implicit constant conversion [-Woverflow]

次のコードは正常に動作しますが:

long long sum; 
sum=pow(10,18); 
cout<<sum; 

かもしれないもの問題 ?

+3

10の19乗は**本当に大きい**数値です... –

+0

_ "問題は何か?" _明らかに2番目の数値パラメータ。 –

+0

@πάνταῥεῖ、thanks – mach

答えて

6

です。

long longは通常64ビットで、64ビット整数はおよそ64ビットです。 1.8 * 10^19の異なる値。しかし、署名されているので、その半分しか得られません(残りの半分は負の値です)。そして、その半分は0.9 * 10^19で、明らかに10^19未満です。

ここでもう1つの問題(警告/オーバーフローの理由ではない)は、pow()関数が浮動小数点値を返すことです。結果がlong longに収まる場合でも、正確さが失われ、正確な整数結果が得られない可能性があります。

編集:もちろん、このケースではunsigned long longを使用できます。それは10^19で十分でしょうが、10^20ではありません。だから、あなたはちょうどunsigned long longに収まらない似たような大きな数字を使っているときに問題を遅らせるだけです。

+0

10^100のような結果を使用したい場合、どうすればいいですか? – mach

+0

浮動小数点値として保存する必要があります。使用している[pow()](http://en.cppreference.com/w/cpp/numeric/math/pow)のバージョンに応じて、 'float'、' double'または 'long double'を使用します。 – Striezel

+0

@mach [GMP](https://gmplib.org)をご覧ください。 –

2

長い長い最大値はのみ9223372036854 775 807 とPOW(10,19)の問題はlong longpow(10,19)の結果を保持するには小さすぎるということである大きな数10000000000000000000

5
log2(10^18) ~ 59.80 
log2(10^19) ~ 63.12 

Aはlong longは符号のために予約1ビットと64ビットであると思われる署名された、このように10^18うまく収まるが、10^19のdoesnt。

また、2^63-1までの数字の保証は、long longに格納することができます。

powも浮動小数点で動作します。その結果は正確ではありません。したがって、それを整数に保存するのは間違いです。

関連する問題