diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2016-05-23 13:52:53 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2016-05-23 13:52:53 +0100 |
commit | 8b7d52a7343846a0f620777e51d0831c6f557113 (patch) | |
tree | 4c1800d4c909b309e8f40122fb4df0983c993f35 | |
parent | 55ec99b70b56e7fb258e4ba2bccdea3767ff8a51 (diff) | |
parent | 834ad57d949e076fd8d467410bfa18eedbfb9cbc (diff) | |
download | Nim-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.nim | 22 |
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 |