例如
如果我有int A = 106
和float B = 10.345f
,哪个操作更精确,A + B
还是(float)A + B
?或者它们实际上具有相同的精度吗?
不,没有区别。当添加两个算术类型时,编译器会应用一组隐式转换。例如,您可以在cppreference上找到这些规则的列表。在你的情况下,规则3)适用:
- 否则,如果其中一个操作数为float、float复数或float虚数,另一个操作数隐式转换如下:
- 整型为浮点型(唯一可能的实数类型是float)仍然按原样)
- […]
因此,如果您没有使用强制类型转换显式声明转换,编译器将隐式地为您执行完全相同的转换。而且由于表达式实际上是相同的,因此在精度上也没有差异。
如果您查看编译器的结果https://godbolt.org/z/x5174j8n9,那么您会看到函数
float add1(int A, float B)
{
return A + B;
}
float add2(int A, float B)
{
return (float)A + B;
}
在启用O2
或O3
优化时给出相同的编译器输出:
add1(int, float):
movaps xmm1, xmm0
pxor xmm0, xmm0
cvtsi2ss xmm0, edi
addss xmm0, xmm1
ret
add2(int, float):
movaps xmm1, xmm0
pxor xmm0, xmm0
cvtsi2ss xmm0, edi
addss xmm0, xmm1
ret