作者:瘦瘦的胖菇凉 | 来源:互联网 | 2024-11-07 11:01
我总是假设双精度除以整数会产生更快的代码,因为编译器会选择更好的微代码来计算:double a;double b = a/3.0;double c = a/3; // will compute fas
我总是假设双精度除以整数会产生更快的代码,因为编译器会选择更好的微代码来计算:
double a;
double b = a/3.0;
double c = a/3; // will compute faster than b
对于单个操作而言,这无关紧要,但对于重复操作而言,它可能会有所不同。我的假设总是正确的还是依赖于编译器或 CPU 之类的?
同样的问题也适用于乘法;即会3 * a
比3.0 * a
?
回答
您的假设不正确,因为您的除法运算都将使用两个double
操作数执行。在第二种情况下,c = a/3
整数文字将在double
生成任何代码之前由编译器转换为一个值。
从这个 C++ 标准草案:
8.3 通常的算术转换 [expr.arith.conv]
1 许多期望算术或枚举类型操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。这种模式称为普通算术转换,其定义如下:
...
(1.3) – 否则,如果任一操作数为双精度,则另一个应转换为双精度。
请注意,在本 C11 标准草案中,第6.3.1.8 节(通常的算术转换)具有等效(实际上,几乎相同)的文本。
请注意,对于使用将 `double` 除以 `int` 的代码进行优化的目标架构,那么任何体面的编译器都会将这样的代码用于像 `3.0` 这样的文字,就像它会为`3` - 它肯定会发现小数部分为零。