From: V Donaldson Date: Thu, 25 May 2023 17:05:26 +0000 (-0700) Subject: [flang] Retain the sign of the argument for the result of fraction(0) X-Git-Tag: upstream/17.0.6~7042 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6c9c69bd761653372999c09c7862290f8793068a;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/flang/runtime/numeric.cpp b/flang/runtime/numeric.cpp index 6760087..5376bcb 100644 --- a/flang/runtime/numeric.cpp +++ b/flang/runtime/numeric.cpp @@ -83,7 +83,7 @@ template inline T Fraction(T x) { } else if (std::isinf(x)) { return std::numeric_limits::quiet_NaN(); // +/-Inf -> NaN } else if (x == 0) { - return 0; // 0 -> 0 + return x; // 0 -> same 0 } else { int ignoredExp; return std::frexp(x, &ignoredExp);