处理浮点常量叠算和取整

缺省情况下,编译器在编译时将大多数涉及常量操作数的操作替换为它们的结果。 此过程称为常量折叠。 通过优化或 -qnostrict 选项,可能会出现其他折叠机会。 在编译时折叠的浮点运算的结果通常会产生与在执行时获得的结果相同的结果,但以下 情况除外:

  • 编译时舍入方式与执行时舍入方式不同。 缺省情况下,这两种方法都是舍入; 但是,如果程序更改了执行时间舍入方式,那么为了避免不同的结果,请执行以下任一操作:
    • 通过使用相应的 -y 选项进行编译,更改编译时间舍入方式以匹配执行时间方式。 有关更多信息和示例,请参阅 匹配编译时和运行时舍入方式
    • 通过使用 -qfloat=nofold 选项进行编译来禁止折叠。
  • a+b*c 之类的表达式在编译时进行部分或完全求值。 结果可能与执行时生成的结果不同,因为在添加到 a之前可能会对 b*c 进行舍入,而运行时 multiply-add 指令不使用任何中间舍入。 为避免产生不同的结果,请执行以下任一操作:
    • 通过使用 -qfloat=nomaf 选项进行编译,禁止使用 multiply-add 指令。
    • 通过使用 -qfloat=nofold 选项进行编译来禁止折叠。
  • 运算会产生无穷大、 NaN, 或向下取整为零的结果。 编译时折叠可防止异常的执行时检测,即使使用 -qflttrap 选项进行编译也是如此。 要避免缺少这些异常,请禁止使用 -qfloat=nofold 选项进行折叠。