From d9d4132f8a79f3a78166c8ee7c629f73093c2659 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sun, 27 Aug 2017 18:17:40 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=BF=D0=B8=D0=BB=D0=B5=D0=BD=20?= =?utf8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20CPMath?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 19 ++++++++++++++----- notes | 6 +----- rtl/java/CPMath.java | 29 +++++++++++++++++++++++++---- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Test.obn b/Test.obn index 0f09bad..f8a3688 100644 --- a/Test.obn +++ b/Test.obn @@ -1,13 +1,22 @@ MODULE Test; -IMPORT CPStrings, Out; +IMPORT Out, CPMath, CPStrings; + VAR s : ARRAY 80 OF CHAR; + v, m, r, f : LONGREAL; + e : LONGINT; BEGIN - CPStrings.IntToString(123456789, s); - Out.String(s); Out.Ln; - CPStrings.RealToString(321.123456, s); - Out.String(s); Out.Ln; + v := CPMath.Pi(); + m := CPMath.Mantissa(v); + e := CPMath.Exponent(v); + r := CPMath.Real(m, e); + f := CPMath.Frac(v); + Out.LongReal(v, 0); Out.Ln; + Out.LongReal(m, 0); Out.Ln; + Out.Int(e, 0); Out.Ln; + Out.LongReal(r, 0); Out.Ln; + Out.LongReal(f, 0); Out.Ln; END Test. diff --git a/notes b/notes index 46fe258..bdd35e2 100644 --- a/notes +++ b/notes @@ -1,8 +1,4 @@ -- Не доделан модуль CPMath (тоже самое синхронизировать с Math/MathL) - * Сделать нормальную реализацию IntPower - * Реализовать Mantissa - * Есть нативные рализации Frac и Trunc? - +- Jasmin создаёт ошибку в float константах, надо как-то порешать. - Нужно делать проверку границ при касте индекса массива с типом HUGEINT - Нужно передавать информацию о файле и строках в кодогенератор. diff --git a/rtl/java/CPMath.java b/rtl/java/CPMath.java index 28f8a6d..33472c7 100644 --- a/rtl/java/CPMath.java +++ b/rtl/java/CPMath.java @@ -97,7 +97,29 @@ public class CPMath public static double IntPower(double x, int n) { - return Math.pow(x, n); + double y = 1.0; + + if(n < 0) + { + x = 1.0 / x; + n = -n; + } + + while(n > 0) + { + if(n % 2 == 1) + { + y = y * x; + n -= 1; + } + else + { + x = x * x; + n = n / 2; + } + } + + return y; } public static double Ln(double x) @@ -112,9 +134,8 @@ public class CPMath public static double Mantissa(double x) { - // Not implemented - SYSTEM.TRAP(-3); - return 0; + int exponent = Math.getExponent(x); + return x / Math.pow(2, exponent); } public static double Pi() -- 2.29.2