瀏覽代碼

LibJS: Add spec comments and check for edge cases in Math.sinh

davidot 2 年之前
父節點
當前提交
8de8742b7c

+ 7 - 2
Userland/Libraries/LibJS/Runtime/MathObject.cpp

@@ -600,9 +600,14 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::log10)
 // 21.3.2.31 Math.sinh ( x ), https://tc39.es/ecma262/#sec-math.sinh
 JS_DEFINE_NATIVE_FUNCTION(MathObject::sinh)
 {
+    // 1. Let n be ? ToNumber(x).
     auto number = TRY(vm.argument(0).to_number(vm));
-    if (number.is_nan())
-        return js_nan();
+
+    // 2. If n is not finite or n is either +0𝔽 or -0𝔽, return n.
+    if (!number.is_finite_number() || number.is_positive_zero() || number.is_negative_zero())
+        return number;
+
+    // 3. Return an implementation-approximated Number value representing the result of the hyperbolic sine of ℝ(n).
     return Value(::sinh(number.as_double()));
 }
 

+ 4 - 0
Userland/Libraries/LibJS/Tests/builtins/Math/Math.sinh.js

@@ -3,4 +3,8 @@ test("basic functionality", () => {
 
     expect(Math.sinh(0)).toBe(0);
     expect(Math.sinh(1)).toBeCloseTo(1.1752011936438014);
+    expect(Math.sinh(NaN)).toBe(NaN);
+    expect(Math.sinh(Number.POSITIVE_INFINITY)).toBe(Number.POSITIVE_INFINITY);
+    expect(Math.sinh(Number.NEGATIVE_INFINITY)).toBe(Number.NEGATIVE_INFINITY);
+    expect(Math.sinh(-0.0)).toBe(-0.0);
 });