Fix overflow bug in fma
This commit is contained in:
+2
-2
@@ -126,8 +126,8 @@ pub fn fma(x: f64, y: f64, z: f64) -> f64 {
|
||||
} else {
|
||||
/* r -= z */
|
||||
let t = rlo;
|
||||
rlo -= zlo;
|
||||
rhi = rhi - zhi - (t < rlo) as u64;
|
||||
rlo = rlo.wrapping_sub(zlo);
|
||||
rhi = rhi.wrapping_sub(zhi.wrapping_sub((t < rlo) as u64));
|
||||
if (rhi >> 63) != 0 {
|
||||
rlo = (-(rlo as i64)) as u64;
|
||||
rhi = (-(rhi as i64)) as u64 - (rlo != 0) as u64;
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
use libm::*;
|
||||
|
||||
#[test]
|
||||
fn fma_segfault() {
|
||||
// These two inputs cause fma to segfault on release due to overflow:
|
||||
assert_eq!(
|
||||
fma(
|
||||
-0.0000000000000002220446049250313,
|
||||
-0.0000000000000002220446049250313,
|
||||
-0.0000000000000002220446049250313
|
||||
),
|
||||
-0.00000000000000022204460492503126,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
fma(-0.992, -0.992, -0.992),
|
||||
-0.00793599999988632,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user