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

Why the below code is not giving the correct value in C++11?

本文关键字:代码 为什么 c++      更新时间:2023-10-16

我写

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

但是显示的是"60000000000000000"而不是"60000000000000001"。

虽然我将d类型转换为(long double),但它给出了正确的值。它不应该调用(long double) version本身吗?

我只是从cppreference.com上引用,希望它在标准方面是准确的。

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

Promoted pow( Arithmetic1 base, Arithmetic2 exp );

现在,指导此重载的规则是,如果Arthmetic1是整型(这是您拥有的),则将其转换为double,而不是long double

因此,听起来您需要在调用pow()时显式强制转换。

双精度浮点值有15-17位有效小数。当60000000000000001(17位十进制数字)强制转换为double时,无法保留第16位和第17位小数,因此结果为6.0e16(或60000000000000000)。当将double的值强制转换回long long时,结果如预期的那样:60000000000000000。见http://en.wikipedia.org/wiki/Double-precision_floating-point_format

得到60000000000000000而不是预期的60000000000000001的原因是pow方法的声明

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 );
源(thx @smarth)

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