浮点数乘法不同于整数除法
Float multiplication differs from integer division
#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;
}
Hello World
res1: 214748368
res2: 214748364
简单的问题:为什么结果不同?
使用 onlinegdb.com
测试
在常见的 C++ 实现中,float
使用 IEEE-754 32 位二进制格式。这种格式将数字表示为一个符号、一个 24 位整数和一个 2 的幂的缩放比例。源文本 0.1f
被转换为最接近的可表示值,即 +13,421,773•2−27 = 0.100000001490116119384765625。然后他们执行*
,INT32_MAX
操作数,2,147,483,647,也被转换为float
。最接近的可表示值是 +1•231 = 2,148,483,648。当它们相乘时,结果为 +13,421,773•24 = 214,748,368.
相比之下,INT32_MAX / 10
将 2,147,483,647 除以 10 并截断,得到 214,748,364。
#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;
}
Hello World
res1: 214748368
res2: 214748364
简单的问题:为什么结果不同?
使用 onlinegdb.com
测试在常见的 C++ 实现中,float
使用 IEEE-754 32 位二进制格式。这种格式将数字表示为一个符号、一个 24 位整数和一个 2 的幂的缩放比例。源文本 0.1f
被转换为最接近的可表示值,即 +13,421,773•2−27 = 0.100000001490116119384765625。然后他们执行*
,INT32_MAX
操作数,2,147,483,647,也被转换为float
。最接近的可表示值是 +1•231 = 2,148,483,648。当它们相乘时,结果为 +13,421,773•24 = 214,748,368.
相比之下,INT32_MAX / 10
将 2,147,483,647 除以 10 并截断,得到 214,748,364。