我试图理解为什么uint64_t
类型无法显示pow(2,64)-1
适当地。 cplusplus标准是199711L。
我检查了pow()
C++98 标准下的函数是
double pow (double base , double exponent);
float pow (float base , float exponent);
long double pow (long double base, long double exponent);
double pow (double base , int exponent);
long double pow (long double base, int exponent);
所以我写了下面的片段
double max1 = (pow(2, 64) - 1);
cout << max1 << endl;
uint64_t max2 = (pow(2, 64) - 1);
cout << max2 << endl;
uint64_t max3 = -1;
cout << max3 << endl;
输出是:
max1: 1.84467e+019
max2: 9223372036854775808
max3: 18446744073709551615
浮点数的精度有限。
在您的系统上(通常假设为 binary64 IEEE-754 格式)18446744073709551615
不是一个在中具有表示形式的数字double
格式。有表示的最接近的数字恰好是18446744073709551616
.
将两个大小截然不同的浮点数相减(或相加)通常会产生错误。对于较小的操作数,此错误可能很重要。如果是18446744073709551616. - 1. -> 18446744073709551616.
减法的误差为 1,实际上与较小的操作数的值相同。
当浮点值转换为整数类型并且该值无法适合整数类型时,程序的行为是未定义的 - 即使整数类型是无符号的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)