diff --git a/src/float.rs b/src/float.rs index 072a91b2..8df32547 100644 --- a/src/float.rs +++ b/src/float.rs @@ -771,7 +771,9 @@ impl FloatCore for f32 { #[inline] #[cfg(not(feature = "std"))] fn to_degrees(self) -> Self { - self * (180.0 / f32::consts::PI) + // Use a constant for better precision. + const PIS_IN_180: f32 = 57.2957795130823208767981548141051703_f32; + self * PIS_IN_180 } #[inline] @@ -841,6 +843,9 @@ impl FloatCore for f64 { #[inline] #[cfg(not(feature = "std"))] fn to_degrees(self) -> Self { + // The division here is correctly rounded with respect to the true + // value of 180/π. (This differs from f32, where a constant must be + // used to ensure a correctly rounded result.) self * (180.0 / f64::consts::PI) } @@ -2008,4 +2013,14 @@ mod tests { assert!((Float::to_radians(deg) - rad).abs() < 1e-5); } } + + #[test] + // This fails with the forwarded `std` implementation in Rust 1.8. + // To avoid the failure, the test is limited to `no_std` builds. + #[cfg(not(feature = "std"))] + fn to_degrees_rounding() { + use float::FloatCore; + + assert_eq!(FloatCore::to_degrees(1_f32), 57.2957795130823208767981548141051703); + } }