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.
-- Не доделан модуль CPMath (тоже самое синхронизировать с Math/MathL)
- * Сделать нормальную реализацию IntPower
- * Реализовать Mantissa
- * Есть нативные рализации Frac и Trunc?
-
+- Jasmin создаёт ошибку в float константах, надо как-то порешать.
- Нужно делать проверку границ при касте индекса массива с типом HUGEINT
- Нужно передавать информацию о файле и строках в кодогенератор.
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()