如果我将float和整数乘以如下所示,为什么所有乘法都会导致不同的结果?我的期望是一致的结果。我认为在这两种情况下,int值在乘法之前被隐式转换为float。但似乎有所不同。这种不同处理的原因是什么?
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
谢谢 的Thorsten
答案 0 :(得分:8)
您可能会遇到以下情况:
假设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
}