summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2016-05-23 13:52:53 +0100
committerDominik Picheta <dominikpicheta@googlemail.com>2016-05-23 13:52:53 +0100
commit8b7d52a7343846a0f620777e51d0831c6f557113 (patch)
tree4c1800d4c909b309e8f40122fb4df0983c993f35
parent55ec99b70b56e7fb258e4ba2bccdea3767ff8a51 (diff)
parent834ad57d949e076fd8d467410bfa18eedbfb9cbc (diff)
downloadNim-8b7d52a7343846a0f620777e51d0831c6f557113.tar.gz
Merge pull request #4203 from def-/torationaloverflow
Fix toRational overflow by calculating internally with int64s (fixes #4194)
-rw-r--r--lib/pure/rationals.nim22
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/pure/rationals.nim b/lib/pure/rationals.nim
index 6fd05dc4b..bf134f2ae 100644
--- a/lib/pure/rationals.nim
+++ b/lib/pure/rationals.nim
@@ -41,26 +41,26 @@ proc toRational*[T:SomeInteger](x: T): Rational[T] =
 
 proc toRationalSub(x: float, n: int): Rational[int] =
   var
-    a = 0
-    b, c, d = 1
+    a = 0'i64
+    b, c, d = 1'i64
   result = 0 // 1   # rational 0
   while b <= n and d <= n:
     let ac = (a+c)
     let bd = (b+d)
     # scale by 1000 so not overflow for high precision
-    let mediant = (ac/1000) / (bd/1000)
+    let mediant = (ac.float/1000) / (bd.float/1000)
     if x == mediant:
       if bd <= n:
-        result.num = ac
-        result.den = bd
+        result.num = ac.int
+        result.den = bd.int
         return result
       elif d > b:
-        result.num = c
-        result.den = d
+        result.num = c.int
+        result.den = d.int
         return result
       else:
-        result.num = a
-        result.den = b
+        result.num = a.int
+        result.den = b.int
         return result
     elif x > mediant:
       a = ac
@@ -69,8 +69,8 @@ proc toRationalSub(x: float, n: int): Rational[int] =
       c = ac
       d = bd
   if (b > n):
-    return initRational(c, d)
-  return initRational(a, b)
+    return initRational(c.int, d.int)
+  return initRational(a.int, b.int)
 
 proc toRational*(x: float, n: int = high(int)): Rational[int] =
   ## Calculate the best rational numerator and denominator