2013-12-23 61 views
7

如果我乘以下面的float和and整数,为什么所有的乘法都会导致不同的结果?我的期望是一致的结果。我认为在这两种情况下,int值都会在乘法之前隐式转换为浮点数。但似乎有区别。这种不同处理的原因是什么?为什么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 

谢谢 托尔斯滕

+0

这是真正的代码?我得到了相同的结果,我不明白为什么它会有所不同。 –

+2

第二个表达式可以在编译时评估 - 你使用的编译器是什么?看看它产生的字节码。 – Floris

+0

在Ubuntu上使用g ++ 4.7.3试验:两个乘法都导致13 – gturri

回答

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 
} 
+0

编译器是否允许在编译时计算中使用不同的表示形式? –

+0

@sftrabbit我的猜测是实现定义的 –

+0

@sftrabbit:我手边没有标准报价,但它是。这也是模板不允许非浮点型参数的原因。 – PlasmaHH

相关问题