[flang-commits] [PATCH] D113308: [flang] Fix folding of EPSILON()

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Fri Nov 5 12:30:02 PDT 2021


klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
klausler requested review of this revision.

The value of EPSILON() was off by one power of two due to my
misreading of the standard; this patch corrects it.
Confirmed by checking other Fortran compilers, which all agree.


https://reviews.llvm.org/D113308

Files:
  flang/include/flang/Evaluate/real.h
  flang/test/Evaluate/folding07.f90


Index: flang/test/Evaluate/folding07.f90
===================================================================
--- flang/test/Evaluate/folding07.f90
+++ flang/test/Evaluate/folding07.f90
@@ -16,22 +16,22 @@
   logical, parameter :: test_bit_size_16 = bs16 == 128
 
   real(2), parameter :: &
-    eps2 = epsilon(0._2), zeps2 = real(z'1000', kind=2), deps2 = 4.8828125e-4_2
+    eps2 = epsilon(0._2), zeps2 = real(z'1400', kind=2), deps2 = 9.765625e-4_2
   real(3), parameter :: &
-    eps3 = epsilon(0._3), zeps3 = real(z'3b80', kind=3), deps3 = 3.90625e-3_3
+    eps3 = epsilon(0._3), zeps3 = real(z'3c00', kind=3), deps3 = 7.8135e-3_3
   real(4), parameter :: &
-    eps4 = epsilon(0._4), zeps4 = real(z'33800000', kind=4), &
-    deps4 = 5.9604644775390625e-8_4
+    eps4 = epsilon(0._4), zeps4 = real(z'34000000', kind=4), &
+    deps4 = 1.1920928955078125e-07_4
   real(8), parameter :: &
-    eps8 = epsilon(0._8), zeps8 = real(z'3ca0000000000000', kind=8), &
-    deps8 = 1.1102230246251565404236316680908203125e-16_8
+    eps8 = epsilon(0._8), zeps8 = real(z'3cb0000000000000', kind=8), &
+    deps8 = 2.2204460492503130808472633361816406250e-16_8
   real(10), parameter :: &
-    eps10 = epsilon(0._10), zeps10 = real(z'3fbf8000000000000000', kind=10), &
-    deps10 = 5.42101086242752217003726400434970855712890625e-20_10
+    eps10 = epsilon(0._10), zeps10 = real(z'3fc08000000000000000', kind=10), &
+    deps10 = 1.08420217248550443400745280086994171142578125e-19_10
   real(16), parameter :: &
     eps16 = epsilon(0._16), &
-    zeps16 = real(z'3f8e0000000000000000000000000000', kind=16), &
-    deps16 = 9.629649721936179265279889712924636592690508241076940976199693977832794189453125e-35_16
+    zeps16 = real(z'3f8f0000000000000000000000000000', kind=16), &
+    deps16 = 1.9259299443872358530559779425849273185381016482153881952399387955665588378906250e-34_16
   logical, parameter :: test_eps2 = eps2 == zeps2 .and. eps2 == deps2
   logical, parameter :: test_eps3 = eps3 == zeps3 .and. eps3 == deps3
   logical, parameter :: test_eps4 = eps4 == zeps4 .and. eps4 == deps4
Index: flang/include/flang/Evaluate/real.h
===================================================================
--- flang/include/flang/Evaluate/real.h
+++ flang/include/flang/Evaluate/real.h
@@ -133,7 +133,7 @@
   static constexpr Real EPSILON() {
     Real epsilon;
     epsilon.Normalize(
-        false, exponentBias - binaryPrecision, Fraction::MASKL(1));
+        false, exponentBias + 1 - binaryPrecision, Fraction::MASKL(1));
     return epsilon;
   }
   static constexpr Real HUGE() {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113308.385153.patch
Type: text/x-patch
Size: 2584 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20211105/992c8b76/attachment.bin>


More information about the flang-commits mailing list