为什么下面的代码没有在C ++ 11中给出正确的值?

时间:2014-08-19 13:37:37

标签: c++

我写了

long long d = 60000000000000001;
cout << (long long ) pow(d,1);

但它正在显示&#34; 60000000000000000&#34;而不是&#34; 60000000000000001&#34;。

虽然如果我使用(long double)进行类型转换,它会给出正确的值。不应该调用(long double)版本本​​身。

3 个答案:

答案 0 :(得分:1)

我将引用cppreference.com,并希望它在标准方面准确无误。

在C ++ 11中,我们有许多可能的重载,但这是你的代码使用的重载:

Promoted pow( Arithmetic1 base, Arithmetic2 exp );

现在,指导此重载的规则是,如果Arthmetic1是一个整数类型(这是你拥有的),那么它将转换为double,而不是long double

所以听起来你需要在pow()的电话中进行明确演员。

答案 1 :(得分:0)

你获得60000000000000000而非预期60000000000000001的原因是pow-method的声明

float       pow( float base, float exp );   
double      pow( double base, double exp );
long double pow( long double base, long double exp );
Promoted pow( Arithmetic1 base, Arithmetic2 exp );

source(thx @smarth)

你的long long被隐式转换为某种浮点数据类型,因此失去了1

答案 2 :(得分:0)

双精度浮点值具有15-17个有效十进制数字。当60000000000000001(17个十进制数字)被强制转换为double时,它无法保留第16和第17个十进制数字,因此结果为6.0e16(或60000000000000000)。当double值转回long long时,结果符合预期:60000000000000000。请参阅http://en.wikipedia.org/wiki/Double-precision_floating-point_format