为什么下面的代码在c++ 11中没有给出正确的值
Why the below code is not giving the correct value in C++11?
我写
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
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 为什么在这个代码结束循环中没有得到结束
- 为什么示例代码访问IUnknown中已删除的内存
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么模数运算符不适用于该代码
- 为什么catch中的代码没有被执行
- 这是什么代码?为什么它有效?C++
- 我遇到了一些C++代码.为什么我们必须在块中使用 *this 而不是这个
- 谁能解释这个代码?为什么显示 1
- 超级基本代码:为什么我的循环没有中断
- 琐碎的C++代码..为什么要编译
- 你能告诉我这个代码为什么崩溃吗
- 有人建议我的代码为什么在basic_ios和sstream中创建错误
- 我读取了一个char类型的变量,然后打印出ascii代码.为什么如果我按回车键,什么都没有
- 我为课堂编写了这个汉明编码代码.为什么这么慢