summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 0b724e1)
raw | patch | inline | side by side (parent: 0b724e1)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 27 Aug 2017 15:17:40 +0000 (18:17 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 27 Aug 2017 15:17:40 +0000 (18:17 +0300) |
Test.obn | patch | blob | history | |
notes | patch | blob | history | |
rtl/java/CPMath.java | patch | blob | history |
diff --git a/Test.obn b/Test.obn
index 0f09bade1d5103f0fca051137c9cc8b9dd5656e5..f8a3688761c9e28b3c33aad87cd805f41a96d9d1 100644 (file)
--- a/Test.obn
+++ b/Test.obn
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.
index 46fe2580f6b3cf7faac2e184637d5e37210fb222..bdd35e2be8039ea3715369b5d9969b9c962661d5 100644 (file)
--- a/notes
+++ b/notes
-- Не доделан модуль CPMath (тоже самое синхронизировать с Math/MathL)
- * Сделать нормальную реализацию IntPower
- * Реализовать Mantissa
- * Есть нативные рализации Frac и Trunc?
-
+- Jasmin создаёт ошибку в float константах, надо как-то порешать.
- Нужно делать проверку границ при касте индекса массива с типом HUGEINT
- Нужно передавать информацию о файле и строках в кодогенератор.
diff --git a/rtl/java/CPMath.java b/rtl/java/CPMath.java
index 28f8a6d29c19ea94aad72e8838e4985947b9f35f..33472c7868d41d45588f033f8022b7b365437ead 100644 (file)
--- a/rtl/java/CPMath.java
+++ b/rtl/java/CPMath.java
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)
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()