Skip to content

Commit 578e7bf

Browse files
committed
Fix FloatingPoint.frexp returning unsigned exponent
C's frexp writes a signed int for the exponent. The Pony wrapper declared it as U32, silently reinterpreting negative exponents as large positive values. Closes #5103
1 parent e514370 commit 578e7bf

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## Fix `FloatingPoint.frexp` returning unsigned exponent
2+
3+
`FloatingPoint.frexp` (and its implementations on `F32` and `F64`) returned the exponent as `U32` when C's `frexp` writes a signed `int`. Negative exponents were silently reinterpreted as large positive values.
4+
5+
The return type is now `(A, I32)` instead of `(A, U32)`. If you destructure the result and type the exponent, update it:
6+
7+
```pony
8+
// Before
9+
(let mantissa, let exp: U32) = my_float.frexp()
10+
11+
// After
12+
(let mantissa, let exp: I32) = my_float.frexp()
13+
```

packages/builtin/float.pony

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use @asinh[F64](x: F64)
5656
use @atanh[F64](x: F64)
5757
use @"llvm.copysign.f32"[F32](x: F32, sign: F32)
5858
use @"llvm.copysign.f64"[F64](x: F64, sign: F64)
59-
use @frexp[F64](value: F64, exponent: Pointer[U32])
59+
use @frexp[F64](value: F64, exponent: Pointer[I32])
6060
use @ldexpf[F32](value: F32, exponent: I32)
6161
use @ldexp[F64](value: F64, exponent: I32)
6262

@@ -202,8 +202,8 @@ primitive F32 is FloatingPoint[F32]
202202
fun ldexp(x: F32, exponent: I32): F32 =>
203203
@ldexpf(x, exponent)
204204

205-
fun frexp(): (F32, U32) =>
206-
var exponent: U32 = 0
205+
fun frexp(): (F32, I32) =>
206+
var exponent: I32 = 0
207207
var mantissa = @frexp(f64(), addressof exponent)
208208
(mantissa.f32(), exponent)
209209

@@ -419,8 +419,8 @@ primitive F64 is FloatingPoint[F64]
419419
fun ldexp(x: F64, exponent: I32): F64 =>
420420
@ldexp(x, exponent)
421421

422-
fun frexp(): (F64, U32) =>
423-
var exponent: U32 = 0
422+
fun frexp(): (F64, I32) =>
423+
var exponent: I32 = 0
424424
var mantissa = @frexp(this, addressof exponent)
425425
(mantissa, exponent)
426426

packages/builtin/real.pony

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ trait val FloatingPoint[A: FloatingPoint[A] val] is Real[A]
668668
fun nan(): Bool
669669

670670
fun ldexp(x: A, exponent: I32): A
671-
fun frexp(): (A, U32)
671+
fun frexp(): (A, I32)
672672
fun log(): A
673673
fun log2(): A
674674
fun log10(): A

0 commit comments

Comments
 (0)