我写了
long long d = 60000000000000001;
cout << (long long ) pow(d,1);
但它正在显示&#34; 60000000000000000&#34;而不是&#34; 60000000000000001&#34;。
虽然如果我使用(long double)进行类型转换,它会给出正确的值。不应该调用(long double)版本本身。
答案 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