Dia*_*ame -1 c++ floating-point double uint64
我试图理解为什么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);
Run Code Online (Sandbox Code Playgroud)
所以我写了下面的代码片段
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;
Run Code Online (Sandbox Code Playgroud)
产出是:
max1: 1.84467e+019
max2: 9223372036854775808
max3: 18446744073709551615
Run Code Online (Sandbox Code Playgroud)
浮点数具有有限的精度.
在您的系统上(通常,假设binary64 IEEE-754格式)18446744073709551615不是具有double格式表示的数字.具有表示的最接近的数字恰好是18446744073709551616.
将两个具有完全不同大小的浮点数相减(并相加)通常会产生错误.相对于较小的操作数,此错误可能很重要.在18446744073709551616. - 1. -> 18446744073709551616.减法误差为1 的情况下,实际上该值与较小的操作数相同.
当浮点值转换为整数类型,并且该值不能适合整数类型时,程序的行为是未定义的 - 即使整数类型是无符号的.