fix jn, ilogb

This commit is contained in:
Andrey Zgarbul 2019-05-09 18:40:19 +03:00
parent 68c49a2362
commit 62e2506745
4 changed files with 17 additions and 19 deletions

View File

@ -26,9 +26,7 @@ mod musl_reference_tests {
// These files are all internal functions or otherwise miscellaneous, not // These files are all internal functions or otherwise miscellaneous, not
// defining a function we want to test. // defining a function we want to test.
const IGNORED_FILES: &[&str] = &[ const IGNORED_FILES: &[&str] = &["fenv.rs"];
"fenv.rs",
];
struct Function { struct Function {
name: String, name: String,

View File

@ -1,4 +1,4 @@
const FP_ILOGBNAN: i32 = -1 - ((!0) >> 1); const FP_ILOGBNAN: i32 = -1 - 0x7fffffff;
const FP_ILOGB0: i32 = FP_ILOGBNAN; const FP_ILOGB0: i32 = FP_ILOGBNAN;
pub fn ilogb(x: f64) -> i32 { pub fn ilogb(x: f64) -> i32 {
@ -17,15 +17,15 @@ pub fn ilogb(x: f64) -> i32 {
e -= 1; e -= 1;
i <<= 1; i <<= 1;
} }
return e; e
} } else if e == 0x7ff {
if e == 0x7ff {
force_eval!(0.0 / 0.0); force_eval!(0.0 / 0.0);
if (i << 12) != 0 { if (i << 12) != 0 {
return FP_ILOGBNAN; FP_ILOGBNAN
} else { } else {
return i32::max_value(); i32::max_value()
} }
} else {
e - 0x3ff
} }
return e - 0x3ff;
} }

View File

@ -1,4 +1,4 @@
const FP_ILOGBNAN: i32 = -1 - ((!0) >> 1); const FP_ILOGBNAN: i32 = -1 - 0x7fffffff;
const FP_ILOGB0: i32 = FP_ILOGBNAN; const FP_ILOGB0: i32 = FP_ILOGBNAN;
pub fn ilogbf(x: f32) -> i32 { pub fn ilogbf(x: f32) -> i32 {
@ -17,15 +17,15 @@ pub fn ilogbf(x: f32) -> i32 {
e -= 1; e -= 1;
i <<= 1; i <<= 1;
} }
return e; e
} } else if e == 0xff {
if e == 0xff {
force_eval!(0.0 / 0.0); force_eval!(0.0 / 0.0);
if (i << 9) != 0 { if (i << 9) != 0 {
return FP_ILOGBNAN; FP_ILOGBNAN
} else { } else {
return i32::max_value(); i32::max_value()
} }
} else {
e - 0x7f
} }
return e - 0x7f;
} }

View File

@ -54,7 +54,7 @@ pub fn jn(n: i32, mut x: f64) -> f64 {
ix &= 0x7fffffff; ix &= 0x7fffffff;
// -lx == !lx + 1 // -lx == !lx + 1
if (ix | (lx | (!lx + 1)) >> 31) > 0x7ff00000 { if (ix | (lx | ((!lx).wrapping_add(1))) >> 31) > 0x7ff00000 {
/* nan */ /* nan */
return x; return x;
} }
@ -268,7 +268,7 @@ pub fn yn(n: i32, x: f64) -> f64 {
ix &= 0x7fffffff; ix &= 0x7fffffff;
// -lx == !lx + 1 // -lx == !lx + 1
if (ix | (lx | (!lx + 1)) >> 31) > 0x7ff00000 { if (ix | (lx | ((!lx).wrapping_add(1))) >> 31) > 0x7ff00000 {
/* nan */ /* nan */
return x; return x;
} }