#include <stdio.h>
#include <iostream>
int main()
{
printf("Hello World\n");
int64_t res1 = INT32_MAX * 0.1f;
int64_t res2 = INT32_MAX / 10;
std::cout << "res1: " << res1 <<"\n";
std::cout << "res2: " << res2 <<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你好世界
资源1:214748368
资源2:214748364
简单的问题:为什么结果不同?
使用 onlinegdb.com 进行测试
在常见的 C++ 实现中,float使用 IEEE-754 32 位二进制格式。此格式将数字表示为符号、24 位整数和 2 的幂缩放。源文本0.1f将转换为最接近的可表示值,即 +13,421,773\xe2\x80\xa22 \xe2\x88\x9227 = 0.100000001490116119384765625。然后,他们执行*,INT32_MAX操作数 2,147,483,647 也转换为float。最接近的可表示值是 +1\xe2\x80\xa22 31 = 2,148,483,648。将它们相乘后,结果为 +13,421,773\xe2\x80\xa22 4 = 214,748,368。
相反,INT32_MAX / 10将 2,147,483,647 除以 10 并截断,得到 214,748,364。