diff --git a/transpiler/src/main/java/org/jsweet/transpiler/extension/RemoveJavaDependenciesAdapter.java b/transpiler/src/main/java/org/jsweet/transpiler/extension/RemoveJavaDependenciesAdapter.java index ef48e47c..df1d5ee1 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/extension/RemoveJavaDependenciesAdapter.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/extension/RemoveJavaDependenciesAdapter.java @@ -553,6 +553,7 @@ public class RemoveJavaDependenciesAdapter extends Java2TypeScriptAdapter { print(invocation.getTargetExpression()).print(".owner"); return true; } + break; case "java.lang.reflect.Array": switch (targetMethodName) { @@ -563,6 +564,16 @@ public class RemoveJavaDependenciesAdapter extends Java2TypeScriptAdapter { return true; } } + break; + + case "java.lang.Math": + switch (targetMethodName) { + case "ulp": + printMacroName(targetMethodName); + print("((x) => { let buffer = new ArrayBuffer(8); let dataView = new DataView(buffer); dataView.setFloat64(0, x); let first = dataView.getUint32(0); let second = dataView.getUint32(4); let rawExponent = first & 0x7ff00000; if (rawExponent == 0x7ff00000) { dataView.setUint32(0,first & 0x7fffffff); } else if (rawExponent == 0) { dataView.setUint32(4,1); dataView.setUint32(0,0); } else if (rawExponent >= (52 << 20) + 0x00100000) { dataView.setUint32(0,rawExponent - (52 << 20)); dataView.setUint32(4,0); } else if (rawExponent >= (33 << 20)) { dataView.setUint32(0,1 << ((rawExponent - (33 << 20)) >>> 20 )); dataView.setUint32(4,0); } else { dataView.setUint32(4,1 << ((rawExponent - 0x00100000) >>> 20)); dataView.setUint32(0,0); } return dataView.getFloat64(0); })(") + .printArgList(invocation.getArguments()).print(")"); + return true; + } } switch (targetMethodName) { @@ -1077,7 +1088,8 @@ public class RemoveJavaDependenciesAdapter extends Java2TypeScriptAdapter { case "equals": printMacroName(targetMethodName); print("((a1, a2) => { if(a1==null && a2==null) return true; if(a1==null || a2==null) return false; if(a1.length != a2.length) return false; for(let i = 0; i < a1.length; i++) { if(a1[i] != a2[i]) return false; } return true; })("); - print(invocation.getTargetExpression(), delegate).print(", ").printArgList(invocation.getArguments()).print(")"); + print(invocation.getTargetExpression(), delegate).print(", ").printArgList(invocation.getArguments()) + .print(")"); return true; } diff --git a/transpiler/src/test/java/org/jsweet/test/transpiler/CalculusTests.java b/transpiler/src/test/java/org/jsweet/test/transpiler/CalculusTests.java index ca123316..0e6c31fd 100644 --- a/transpiler/src/test/java/org/jsweet/test/transpiler/CalculusTests.java +++ b/transpiler/src/test/java/org/jsweet/test/transpiler/CalculusTests.java @@ -91,6 +91,9 @@ public class CalculusTests extends AbstractTest { Assert.assertEquals(Math.abs(-1) + Math.abs(-1), (int) r.get("2"), 0.00001); Assert.assertEquals(Math.cbrt(2), (double) r.get("3"), 0.00001); Assert.assertEquals(Math.cbrt(2), (double) r.get("4"), 0.00001); + Assert.assertEquals(Math.cbrt(2), (double) r.get("4"), 0.00001); + Assert.assertTrue(Math.ulp(956.294) == 1.1368683772161603E-13); + Assert.assertTrue(Math.ulp(123.1) == 1.4210854715202004E-14); }, getSourceFile(MathApi.class)); } diff --git a/transpiler/src/test/java/source/calculus/MathApi.java b/transpiler/src/test/java/source/calculus/MathApi.java index 71a180f9..90d93b67 100644 --- a/transpiler/src/test/java/source/calculus/MathApi.java +++ b/transpiler/src/test/java/source/calculus/MathApi.java @@ -1,19 +1,18 @@ package source.calculus; -import static jsweet.util.Lang.$export; - import static java.lang.Math.abs; import static java.lang.Math.cbrt; +import static jsweet.util.Lang.$export; public class MathApi { public static void main(String[] args) { - + // with static import and fully qualified name $export("2", java.lang.Math.abs(-1) + abs(-1)); $export("3", java.lang.Math.cbrt(2)); $export("4", cbrt(2)); - + $export("E", Math.E); $export("PI", Math.PI); $export("abs_123", Math.abs(-123)); @@ -23,6 +22,9 @@ public class MathApi { $export("signum_2342", Math.signum(-2342)); $export("scalb1_2__2", Math.scalb(1.2, 2)); $export("toDegres0_5", Math.toDegrees(0.5)); + + assert Math.ulp(956.294) == 1.1368683772161603E-13; + assert Math.ulp(123.1) == 1.4210854715202004E-14; }