about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorPhosphorus15 <steepout@qq.com>2019-08-19 17:22:08 +0800
committerPhosphorus15 <steepout@qq.com>2019-08-19 17:22:08 +0800
commitc4569347b260fa1ae00ede021e39f2a3227da4ad (patch)
tree63316844a54277376910f4962f7d3ef764e21703 /src/libstd
parent92f08b78a12ff119af853cb2bf58468208ea6a90 (diff)
downloadrust-c4569347b260fa1ae00ede021e39f2a3227da4ad.tar.gz
rust-c4569347b260fa1ae00ede021e39f2a3227da4ad.zip
Added negative cases for `asinh` according to IEEE-754.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/f32.rs15
-rw-r--r--src/libstd/f64.rs15
2 files changed, 22 insertions, 8 deletions
diff --git a/src/libstd/f32.rs b/src/libstd/f32.rs
index f649170c403..653108cbece 100644
--- a/src/libstd/f32.rs
+++ b/src/libstd/f32.rs
@@ -908,10 +908,17 @@ impl f32 {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[inline]
     pub fn asinh(self) -> f32 {
-        if self == NEG_INFINITY {
-            NEG_INFINITY
-        } else {
-            (self + ((self * self) + 1.0).sqrt()).ln()
+        match self {
+            x if x == NEG_INFINITY => NEG_INFINITY,
+            x if x.is_sign_negative() => {
+                let v = (x + ((x * x) + 1.0).sqrt()).ln();
+                if v.is_sign_negative() {
+                    v
+                } else {
+                    -v
+                }
+            }
+            x => (x + ((x * x) + 1.0).sqrt()).ln()
         }
     }
 
diff --git a/src/libstd/f64.rs b/src/libstd/f64.rs
index f61630997dc..e5f963d8736 100644
--- a/src/libstd/f64.rs
+++ b/src/libstd/f64.rs
@@ -831,10 +831,17 @@ impl f64 {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[inline]
     pub fn asinh(self) -> f64 {
-        if self == NEG_INFINITY {
-            NEG_INFINITY
-        } else {
-            (self + ((self * self) + 1.0).sqrt()).ln()
+        match self {
+            x if x == NEG_INFINITY => NEG_INFINITY,
+            x if x.is_sign_negative() => {
+                let v = (x + ((x * x) + 1.0).sqrt()).ln();
+                if v.is_sign_negative() {
+                    v
+                } else {
+                    -v
+                }
+            }
+            x => (x + ((x * x) + 1.0).sqrt()).ln()
         }
     }