【发布时间】:2014-10-07 18:37:36
【问题描述】:
考虑下面两个非常简单的乘法:
double result1;
long double result2;
float var1=3.1;
float var2=6.789;
double var3=87.45;
double var4=234.987;
result1=var1*var2;
result2=var3*var4;
默认情况下,乘法是否以比操作数更高的精度进行?我的意思是,在第一次乘法的情况下,它是以双精度完成的,而在 x86 架构中的第二次乘法的情况下,它是以 80 位扩展精度完成的,还是我们应该自己将表达式中的操作数转换为更高的精度,如下所示?
result1=(double)var1*(double)var2;
result2=(long double)var3*(long double)var4;
其他操作(加法、除法和余数)呢?例如,当添加两个以上的正单精度值时,如果用于保存表达式的中间结果,则使用双精度的额外有效位可以减少舍入误差。
【问题讨论】:
-
@BasileStarynkevitch:这如何解决这个问题?
-
这很大程度上取决于您的编译器版本。三巨头的当前版本都使用 SSE2,因此使用 64 位精度。看看生成的机器码就知道了。您需要更好的测试代码,它是在您发布的 sn-ps 的编译时完成的。
标签: c++ floating-point rounding floating-point-precision arithmetic-expressions