为什么 - GCC中的-freciprocal-math不安全?

Kid*_*Kid 12 c compiler-construction math precision gcc

-freciprocal-math 在GCC中更改以下代码

double a = b / c;
Run Code Online (Sandbox Code Playgroud)

 double tmp = 1/c;
 double a = b * tmp;
Run Code Online (Sandbox Code Playgroud)

在GCC手册中,据说这种优化是不安全的,并且不符合IEEE标准.但我想不出一个例子.你能举个例子吗?

R..*_*R.. 13

除以10并乘以0.1000000000000000055511151231257827021181583404541015625也不是一回事.

  • 这就是选项不安全的原因.它打破了具有确切答案的代码.即使舍入使答案出现相同,也会错误地提出不准确的异常.如果优化打破了一段正确的代码,则优化是不安全/错误的; 它不必在所有情况下甚至是典型情况下都明显破坏结果. (4认同)
  • @Ira:另外,为了澄清,以下是GCC的文档对不安全浮点优化集的说法:"任何-O选项都没有启用此选项,因为它可能导致程序的输出不正确,这取决于具体的实现数学函数的IEEE或ISO规则/规范.但是,它可以为不需要保证这些规范的程序产生更快的代码." 因此问题不是期望浮点运算的"确切答案",而是期望在某些特定规则之后产生的答案. (3认同)
  • 最重要的是:如果您认为这种微小的不精确性与您的软件无关,那么请继续使用-freciprocal-math.您是此选项的预期用户. (3认同)
  • @Ira:有些时候人们都知道要得到确切的答案.此外,即使对于人们可能没有采取这种照顾的其他时间,他们也可能期望在一个系统上产生的答案将匹配在另一个系统上产生的答案. (2认同)