为什么整数/浮点数乘法会导致不同的结果

Why does int/float multiplication lead to different results?

本文关键字:结果 整数 浮点数 为什么      更新时间:2023-10-16

如果我像下面这样将浮点数和整数相乘,为什么所有的乘法都会导致不同的结果?我的期望是一致的结果。我认为在这两种情况下,int 值都会在乘法之前隐式转换为浮点数。但似乎有区别。这种不同处理的原因是什么?

int multiply(float val, int multiplier)
{
    return val * multiplier;
}
int multiply2(float val, int multiplier)
{
    return float(val * multiplier);
}
float val = 1.3f;
int result0 = val * int(10); // 12
int result1 = 1.3f * int(10); // 13
int result3 = multiply(1.3f, 10); //12 
int result4 = multiply2(1.3f, 10); // 13

谢谢 托尔斯滕

可能发生的情况是:

假设 IEEE 或类似的浮点数,1.3 不能表示,并且可能是像 1.299999 这样的东西,乘以 10 就是 12.99999,然后截断为 int 是 12。

但是,可以在编译时计算 1.3 * 10,从而最有可能准确表示 13。

根据代码的实际结构、使用的编译器以及与哪些设置一起使用,它可以计算 1 到 12 或 13,具体取决于它是在运行时还是编译时执行此操作。

为了完整起见,我可以使用以下代码重现它:

extern int result0;
extern int result1;
float val = 1.3f;
void foo( )
{   
 result0 = val * int(10); // 12
 result1 = 1.3f * int(10); // 13
}