[flang] Retain the sign of the argument for the result of fraction(0)
authorV Donaldson <vdonaldson@nvidia.com>
Thu, 25 May 2023 17:05:26 +0000 (10:05 -0700)
committerV Donaldson <vdonaldson@nvidia.com>
Fri, 26 May 2023 16:24:30 +0000 (09:24 -0700)
commit6c9c69bd761653372999c09c7862290f8793068a
tree9c0b8956881df501672faa8ca97d177db5d43417
parentc5e6c886aabb36ab66b4ed835da243c2a3455ade
[flang] Retain the sign of the argument for the result of fraction(0)

The f18 clause 16.9.80 description of the FRACTION(X) intrinsic states:

    Result Value. The result has the value ....
    If X has the value zero, the result is zero.
    If X is an IEEE NaN, the result is that NaN.
    If X is an IEEE infinity, the result is an IEEE NaN.

This clause does not specify whether fraction(-0.0) should be -0.0 or +0.0.
However, a folded result and a runtime result should be consistent, and
returning -0.0 is more in line with the result for fraction(NaN).

For this test:

  print '(2f6.1)', 0.0, fraction(0.0)
  call f(0.0)
  print '(2f6.1)', -0.0, fraction(-0.0)
  call f(-0.0)
  end

  subroutine f(x)
    print '(2f6.1)', x, fraction(x)
  end

Current output is:

   0.0   0.0
   0.0   0.0
  -0.0  -0.0
  -0.0   0.0

Change that to:

   0.0   0.0
   0.0   0.0
  -0.0  -0.0
  -0.0  -0.0
flang/runtime/numeric.cpp