浮点数乘法不同于整数除法

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。