Skip to content

Commit 6755782

Browse files
authored
fix(runtime): Correct Bi.toFloat64 rounding (#2160)
1 parent 6c33d08 commit 6755782

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

compiler/test/stdlib/float64.test.gr

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,19 @@ assert e == 2.718281828459045d
2121
let fromNumber = fromNumber
2222
assert fromNumber(5) == 5.0d
2323
assert fromNumber(0) == 0.0d
24+
assert fromNumber(0.5) == 0.5d
25+
assert fromNumber(1/2) == 0.5d
26+
assert fromNumber(-1/2) == -0.5d
27+
// Not exact because of ieee754 rounding error
28+
assert fromNumber(18_446_744_073_709_551_615) == 18_446_744_073_709_552_000.0d
29+
assert fromNumber(18_446_744_073_709_551_616) == 18_446_744_073_709_552_000.0d
30+
assert fromNumber(18_446_744_073_709_551_616) == 18_446_744_073_709_551_616.0d
31+
assert fromNumber(-18_446_744_073_709_551_615) == -18446744073709552000.0d
32+
assert fromNumber(-18_446_744_073_709_551_616) == -18446744073709552000.0d
33+
assert fromNumber(-18_446_744_073_709_551_616) == -18_446_744_073_709_551_616.0d
34+
// overflow
35+
assert fromNumber(1.7976931348623157e+309) == Infinityd
36+
assert fromNumber(-1.7976931348623157e+309) == -Infinityd
2437

2538
assert toNumber(555.0d) == 555
2639
assert toNumber(0.0d) == 0

stdlib/runtime/bigint.gr

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -521,11 +521,8 @@ provide let toFloat64 = (num: WasmI32) => {
521521
let mut result = 0.0W
522522
use WasmI32.{ (+) }
523523
for (let mut i = 0n; WasmI32.ltU(i, numLimbs); i += 1n) {
524-
if (!WasmI32.eqz(i)) {
525-
result *= factor
526-
}
527524
use WasmF64.{ (+) }
528-
result += WasmF64.convertI64U(getLimb(num, i))
525+
result += WasmF64.convertI64U(getLimb(num, i)) * factor
529526
}
530527
result
531528
}

0 commit comments

Comments
 (0)