是否有一种优先的方式来订购浮点操作数?

lin*_*lof 18 c floating-point

假设我有一个非常小的float a(例如a=0.5)输入以下表达式:

6000.f * a * a;
Run Code Online (Sandbox Code Playgroud)

操作数的顺序是否有所不同?写作更好吗?

6000.f * (a*a);
Run Code Online (Sandbox Code Playgroud)

甚至

float result = a*a;
result *= 6000.f;
Run Code Online (Sandbox Code Playgroud)

我已经检查过每个计算机科学家应该知道的关于浮点运算的经典之作,但找不到任何东西.

是否有一种在浮点运算中对操作数进行排序的最佳方法?

R..*_*R.. 6

这实际上取决于价值观和目标.例如,如果a非常小,a*a可能为零,而6000.0*a*a(这意味着(6000.0*a)*a)可能仍然是非零的.为了避免上溢和下溢,一般规则是应用关联法则首先执行乘法,其中操作数的日志具有相反的符号,这意味着先行平方通常是最差的策略.另一方面,出于性能原因,如果可以重用平方的值,则首先平方可能是一个非常好的策略.您可能会遇到另一个问题,如果您的数字永远不会非常接近于零或无穷大,那么对于正确性而言可能比溢出/下溢问题更重要:某些乘法可以保证具有精确答案,而其他则涉及舍入.通常,通过最小化发生的舍入步骤的数量,您将获得最准确的结果.