DEADSOFTWARE

Допилен модуль CPMath
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 27 Aug 2017 15:17:40 +0000 (18:17 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 27 Aug 2017 15:17:40 +0000 (18:17 +0300)
Test.obn
notes
rtl/java/CPMath.java

index 0f09bade1d5103f0fca051137c9cc8b9dd5656e5..f8a3688761c9e28b3c33aad87cd805f41a96d9d1 100644 (file)
--- 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 46fe2580f6b3cf7faac2e184637d5e37210fb222..bdd35e2be8039ea3715369b5d9969b9c962661d5 100644 (file)
--- a/notes
+++ b/notes
@@ -1,8 +1,4 @@
-- Не доделан модуль CPMath (тоже самое синхронизировать с Math/MathL)
-    * Сделать нормальную реализацию IntPower
-    * Реализовать Mantissa
-    * Есть нативные рализации Frac и Trunc?
-
+- Jasmin создаёт ошибку в float константах, надо как-то порешать.
 - Нужно делать проверку границ при касте индекса массива с типом HUGEINT
 
 - Нужно передавать информацию о файле и строках в кодогенератор.
index 28f8a6d29c19ea94aad72e8838e4985947b9f35f..33472c7868d41d45588f033f8022b7b365437ead 100644 (file)
@@ -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()