Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 0f037e9

Browse files
committed
Fixed a few int overflows
rem_pio2 had incorrect u32/i32 operations remquo has a straight int overflow
1 parent 3f23cac commit 0f037e9

File tree

3 files changed

+48
-21
lines changed

3 files changed

+48
-21
lines changed

src/math/rem_pio2.rs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -179,29 +179,44 @@ pub(crate) fn rem_pio2(x: f64) -> (i32, f64, f64) {
179179
i -= 1;
180180
}
181181
let mut ty = [0.0; 3];
182-
let n = rem_pio2_large(&tx[..=i], &mut ty, ((ix >> 20) - (0x3ff + 23)) as i32, 1);
182+
let n = rem_pio2_large(&tx[..=i], &mut ty, ((ix as i32) >> 20) - (0x3ff + 23), 1);
183183
if sign != 0 {
184184
return (-n, -ty[0], -ty[1]);
185185
}
186186
(n, ty[0], ty[1])
187187
}
188188

189-
#[test]
190-
fn test_near_pi() {
191-
assert_eq!(
192-
rem_pio2(3.141592025756836),
193-
(2, -6.278329573009626e-7, -2.1125998133974653e-23)
194-
);
195-
assert_eq!(
196-
rem_pio2(3.141592033207416),
197-
(2, -6.20382377148128e-7, -2.1125998133974653e-23)
198-
);
199-
assert_eq!(
200-
rem_pio2(3.141592144966125),
201-
(2, -5.086236681942706e-7, -2.1125998133974653e-23)
202-
);
203-
assert_eq!(
204-
rem_pio2(3.141592979431152),
205-
(2, 3.2584135866119817e-7, -2.1125998133974653e-23)
206-
);
189+
#[cfg(test)]
190+
mod tests {
191+
use super::rem_pio2;
192+
193+
#[test]
194+
fn test_near_pi() {
195+
assert_eq!(
196+
rem_pio2(3.141592025756836),
197+
(2, -6.278329573009626e-7, -2.1125998133974653e-23)
198+
);
199+
assert_eq!(
200+
rem_pio2(3.141592033207416),
201+
(2, -6.20382377148128e-7, -2.1125998133974653e-23)
202+
);
203+
assert_eq!(
204+
rem_pio2(3.141592144966125),
205+
(2, -5.086236681942706e-7, -2.1125998133974653e-23)
206+
);
207+
assert_eq!(
208+
rem_pio2(3.141592979431152),
209+
(2, 3.2584135866119817e-7, -2.1125998133974653e-23)
210+
);
211+
}
212+
213+
#[test]
214+
fn test_overflow_b9b847() {
215+
let _ = rem_pio2(-3054214.5490637687);
216+
}
217+
218+
#[test]
219+
fn test_overflow_4747b9() {
220+
let _ = rem_pio2(917340800458.2274);
221+
}
207222
}

src/math/rem_pio2_large.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ pub(crate) fn rem_pio2_large(x: &[f64], y: &mut [f64], e0: i32, prec: usize) ->
256256
let jv = jv as usize;
257257

258258
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
259-
let mut j = (jv - jx) as i32;
259+
let mut j = (jv as i32) - (jx as i32);
260260
let m = jx + jk;
261261
for i in 0..=m {
262262
i!(f, i, =, if j < 0 {

src/math/remquo.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ pub fn remquo(mut x: f64, mut y: f64) -> (f64, i32) {
8585
}
8686
if ex == ey || (ex + 1 == ey && (2.0 * x > y || (2.0 * x == y && (q % 2) != 0))) {
8787
x -= y;
88-
q += 1;
88+
// TODO: this matches musl behavior, but it is incorrect
89+
q = q.wrapping_add(1);
8990
}
9091
q &= 0x7fffffff;
9192
let quo = if sx ^ sy { -(q as i32) } else { q as i32 };
@@ -95,3 +96,14 @@ pub fn remquo(mut x: f64, mut y: f64) -> (f64, i32) {
9596
(x, quo)
9697
}
9798
}
99+
100+
#[cfg(test)]
101+
mod tests {
102+
use super::remquo;
103+
104+
#[test]
105+
fn test_q_overflow() {
106+
// 0xc000000000000001, 0x04c0000000000004
107+
let _ = remquo(-2.0000000000000004, 8.406091369059082e-286);
108+
}
109+
}

0 commit comments

Comments
 (0)