【问题标题】:Double divided by double and by integer: which one is better?双除以双数和整数:哪个更好?
【发布时间】:2021-08-15 09:04:20
【问题描述】:

我总是假设将双精度数除以整数会导致代码更快,因为编译器会选择更好的微码进行计算:

double a;
double b = a/3.0;
double c = a/3; // will compute faster than b

对于单个操作而言,这无关紧要,但对于重复性操作,它会产生影响。我的假设总是正确的还是编译器或 CPU 依赖或其他什么?

同样的问题也适用于乘法;即3 * a 会比3.0 * a 快​​吗?

【问题讨论】:

  • 如果第二个操作数是常数,则没有区别。
  • 据我所知,算术/浮点单元内部没有混合类型。在机器级别,两个操作数都属于同一类型……如果需要,可以预先转换。 a3.0 具有相同的类型 (double)...a3 需要(通过编译器,而不是在运行时)进行(隐式)转换。
  • 先阅读这个 :) 浮点在硬件中处理(除非你有一个小处理器)stackoverflow.com/questions/4584637/…
  • C 和 C++ 有区别吗?如果是这样,问题应该澄清是指哪种语言。如果不是,这应该在答案中解决。
  • @mkrieger1 我的意思是主要用于 C++。但我认为它对 C 也适用,因为编译器的数学运算是相同的。

标签: c++ c


【解决方案1】:

您的假设正确,因为您的两个除法运算都将使用两个 double 操作数执行。在第二种情况下,c = a/3,在生成任何代码之前,编译器会将整数文字转换为 double 值。

来自this Draft C++ Standard

8.3 常用算术转换          [expr.arith.conv]

1    许多二元运算符 期望算术或枚举类型的操作数导致 转换和产生结果类型以类似的方式。目的是为了 yield 一个通用类型,它也是结果的类型。这 模式被称为通常的算术转换,它们是 定义如下:

(1.3) – 否则,如果任一操作数为 double,则应转换另一个操作数 加倍。


请注意,在this Draft C11 Standard 中,§6.3.1.8(通常的算术转换)具有等效(实际上,几乎相同)的文本。

【讨论】:

  • 请注意,对于使用将double 除以int 的代码进行优化的目标架构,那么任何体面的编译器都会将此类代码用于像@ 这样的文字987654328@,就像 3 一样 - 它肯定会发现小数部分为零。
【解决方案2】:

没有区别。整数操作数被隐式转换为双精度数,因此它们实际上是等价的。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2010-10-14
    • 2018-11-21
    相关资源
    最近更新 更多