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

6000.f * a * a;

操作数的顺序有什么区别吗?更好写吗
6000.f * (a*a);

甚至
float result = a*a;
result *= 6000.f;

我检查了经典的What Every Computer Scientist Should Know About Floating-Point Arithmetic,但找不到任何东西。

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

最佳答案

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

关于c - 有没有一种首选的方式来对浮点操作数进行排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7935656/

10-13 07:05