This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-numbers.git

commit 57bef6afd3fcb5891904debf9884d271ad9d430a
Author: Schamschi <heinrich.bo...@gmx.at>
AuthorDate: Sat Jun 22 03:45:19 2019 +0200

    NUMBERS-119: Take care of special exponent bias with subnormal numbers
---
 .../apache/commons/numbers/fraction/BigFraction.java | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
index a440261..2108eb8 100644
--- 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
+++ 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
@@ -219,19 +219,31 @@ public class BigFraction extends Number implements 
Comparable<BigFraction>, Seri
             throw new IllegalArgumentException("cannot convert infinite 
value");
         }
 
-        // compute m and k such that value = m * 2^k
         final long bits     = Double.doubleToLongBits(value);
         final long sign     = bits & 0x8000000000000000L;
         final long exponent = bits & 0x7ff0000000000000L;
-        long m              = bits & 0x000fffffffffffffL;
+        final long mantissa = bits & 0x000fffffffffffffL;
+
+        // compute m and k such that value = m * 2^k
+        long m;
+        int k;
+
         if (exponent != 0) {
             // this was a normalized number, add the implicit most significant 
bit
-            m |= 0x0010000000000000L;
+            m = mantissa | 0x0010000000000000L;
+            k = ((int) (exponent >> 52)) - 1023 - 52;
+        } else {
+            m = mantissa;
+            if (m == 0) { //number is zero, set k to 0 for simplicity
+                k = 0;
+            } else {
+                // subnormal number, the effective exponent bias is only 1022
+                k = ((int) (exponent >> 52)) - 1022 - 52;
+            }
         }
         if (sign != 0) {
             m = -m;
         }
-        int k = ((int) (exponent >> 52)) - 1075;
         while (((m & 0x001ffffffffffffeL) != 0) && ((m & 0x1) == 0)) {
             m >>= 1;
             ++k;

Reply via email to