瀏覽代碼

LibJS: Add Math.exp()

Linus Groh 5 年之前
父節點
當前提交
e375766f98

+ 12 - 1
Libraries/LibJS/Runtime/MathObject.cpp

@@ -50,6 +50,7 @@ MathObject::MathObject()
     put_native_function("cos", cos, 1, attr);
     put_native_function("cos", cos, 1, attr);
     put_native_function("tan", tan, 1, attr);
     put_native_function("tan", tan, 1, attr);
     put_native_function("pow", pow, 2, attr);
     put_native_function("pow", pow, 2, attr);
+    put_native_function("exp", exp, 1, attr);
     put_native_function("sign", sign, 1, attr);
     put_native_function("sign", sign, 1, attr);
 
 
     put("E", Value(M_E), 0);
     put("E", Value(M_E), 0);
@@ -204,7 +205,17 @@ Value MathObject::tan(Interpreter& interpreter)
 
 
 Value MathObject::pow(Interpreter& interpreter)
 Value MathObject::pow(Interpreter& interpreter)
 {
 {
-    return exp(interpreter, interpreter.argument(0), interpreter.argument(1));
+    return JS::exp(interpreter, interpreter.argument(0), interpreter.argument(1));
+}
+
+Value MathObject::exp(Interpreter& interpreter)
+{
+    auto number = interpreter.argument(0).to_number(interpreter);
+    if (interpreter.exception())
+        return {};
+    if (number.is_nan())
+        return js_nan();
+    return Value(::pow(M_E, number.as_double()));
 }
 }
 
 
 Value MathObject::sign(Interpreter& interpreter)
 Value MathObject::sign(Interpreter& interpreter)

+ 1 - 0
Libraries/LibJS/Runtime/MathObject.h

@@ -51,6 +51,7 @@ private:
     static Value cos(Interpreter&);
     static Value cos(Interpreter&);
     static Value tan(Interpreter&);
     static Value tan(Interpreter&);
     static Value pow(Interpreter&);
     static Value pow(Interpreter&);
+    static Value exp(Interpreter&);
     static Value sign(Interpreter&);
     static Value sign(Interpreter&);
 };
 };
 
 

+ 8 - 11
Libraries/LibJS/Tests/Math-constants.js

@@ -1,17 +1,14 @@
 load("test-common.js");
 load("test-common.js");
 
 
-// Borrowed from LibM/TestMath.cpp :^)
-function expectClose(a, b) { assert(Math.abs(a - b) < 0.000001); }
-
 try {
 try {
-    expectClose(Math.E, 2.718281);
-    expectClose(Math.LN2, 0.693147);
-    expectClose(Math.LN10, 2.302585);
-    expectClose(Math.LOG2E, 1.442695);
-    expectClose(Math.LOG10E, 0.434294);
-    expectClose(Math.PI, 3.1415926);
-    expectClose(Math.SQRT1_2, 0.707106);
-    expectClose(Math.SQRT2, 1.414213);
+    assert(isClose(Math.E, 2.718281));
+    assert(isClose(Math.LN2, 0.693147));
+    assert(isClose(Math.LN10, 2.302585));
+    assert(isClose(Math.LOG2E, 1.442695));
+    assert(isClose(Math.LOG10E, 0.434294));
+    assert(isClose(Math.PI, 3.1415926));
+    assert(isClose(Math.SQRT1_2, 0.707106));
+    assert(isClose(Math.SQRT2, 1.414213));
 
 
     console.log("PASS");
     console.log("PASS");
 } catch (e) {
 } catch (e) {

+ 19 - 0
Libraries/LibJS/Tests/Math.exp.js

@@ -0,0 +1,19 @@
+load("test-common.js");
+
+try {
+    assert(Math.exp.length === 1);
+
+    assert(Math.exp(0) === 1);
+    assert(isClose(Math.exp(-2), 0.135335));
+    assert(isClose(Math.exp(-1), 0.367879));
+    assert(isClose(Math.exp(1), 2.718281));
+    assert(isClose(Math.exp(2), 7.389056));
+
+    assert(isNaN(Math.exp()));
+    assert(isNaN(Math.exp(undefined)));
+    assert(isNaN(Math.exp("foo")));
+
+    console.log("PASS");
+} catch (e) {
+    console.log("FAIL: " + e);
+}

+ 8 - 0
Libraries/LibJS/Tests/test-common.js

@@ -50,3 +50,11 @@ function assertThrowsError(testFunction, options) {
     }
     }
 }
 }
 
 
+/**
+ * Check whether the difference between two numbers is less than 0.000001.
+ * @param {Number} a First number
+ * @param {Number} b Second number
+ */
+function isClose(a, b) {
+    return Math.abs(a - b) < 0.000001;
+}