1,5 → 1,5 |
(* |
Copyright 2016 Anton Krotov |
(* |
Copyright 2016, 2018 Anton Krotov |
|
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by |
134,23 → 134,23 |
RETURN Res & (s[i] <= 20X) |
END CheckReal; |
|
PROCEDURE StrToFloat(str: STRING; VAR err: BOOLEAN): LONGREAL; |
CONST maxDBL = 1.69D308; maxINT = 7FFFFFFFH; |
VAR i, scale: INTEGER; res, m, d: LONGREAL; minus, neg: BOOLEAN; |
PROCEDURE StrToFloat(str: STRING; VAR err: BOOLEAN): REAL; |
CONST maxDBL = 1.69E308; maxINT = 7FFFFFFFH; |
VAR i, scale: INTEGER; res, m, d: REAL; minus, neg: BOOLEAN; |
|
PROCEDURE part1(): BOOLEAN; |
PROCEDURE part1 (str: STRING; VAR res, d: REAL; VAR i: INTEGER): BOOLEAN; |
BEGIN |
res := 0.0D0; |
d := 1.0D0; |
res := 0.0; |
d := 1.0; |
WHILE digit(str[i]) DO |
res := res * 10.0D0 + LONG(FLT(ORD(str[i]) - ORD("0"))); |
res := res * 10.0 + FLT(ORD(str[i]) - ORD("0")); |
INC(i) |
END; |
IF str[i] = "." THEN |
INC(i); |
WHILE digit(str[i]) DO |
d := d / 10.0D0; |
res := res + LONG(FLT(ORD(str[i]) - ORD("0"))) * d; |
d := d / 10.0; |
res := res + FLT(ORD(str[i]) - ORD("0")) * d; |
INC(i) |
END |
END |
157,10 → 157,10 |
RETURN str[i] # 0X |
END part1; |
|
PROCEDURE part2(): BOOLEAN; |
PROCEDURE part2 (str: STRING; VAR i, scale: INTEGER; VAR minus, err: BOOLEAN; VAR m, res: REAL): BOOLEAN; |
BEGIN |
INC(i); |
m := 10.0D0; |
m := 10.0; |
minus := FALSE; |
IF str[i] = "+" THEN |
INC(i) |
167,7 → 167,7 |
ELSIF str[i] = "-" THEN |
minus := TRUE; |
INC(i); |
m := 0.1D0 |
m := 0.1 |
END; |
scale := 0; |
err := FALSE; |
174,12 → 174,12 |
WHILE ~err & digit(str[i]) DO |
IF scale > maxINT DIV 10 THEN |
err := TRUE; |
res := 0.0D0 |
res := 0.0 |
ELSE |
scale := scale * 10; |
IF scale > maxINT - (ORD(str[i]) - ORD("0")) THEN |
err := TRUE; |
res := 0.0D0 |
res := 0.0 |
ELSE |
scale := scale + (ORD(str[i]) - ORD("0")); |
INC(i) |
189,19 → 189,19 |
RETURN ~err |
END part2; |
|
PROCEDURE part3; |
PROCEDURE part3 (VAR err, minus: BOOLEAN; VAR res, m: REAL; VAR scale: INTEGER); |
VAR i: INTEGER; |
BEGIN |
err := FALSE; |
IF scale = maxINT THEN |
err := TRUE; |
res := 0.0D0 |
res := 0.0 |
END; |
i := 1; |
WHILE ~err & (i <= scale) DO |
IF ~minus & (res > maxDBL / m) THEN |
err := TRUE; |
res := 0.0D0 |
res := 0.0 |
ELSE |
res := res * m; |
INC(i) |
211,14 → 211,14 |
|
BEGIN |
IF CheckReal(str, i, neg) THEN |
IF part1() & part2() THEN |
part3 |
IF part1(str, res, d, i) & part2(str, i, scale, minus, err, m, res) THEN |
part3(err, minus, res, m, scale) |
END; |
IF neg THEN |
res := -res |
END |
ELSE |
res := 0.0D0; |
res := 0.0; |
err := TRUE |
END |
RETURN res |
251,7 → 251,7 |
Done := TRUE |
END Ln; |
|
PROCEDURE LongReal*(VAR x: LONGREAL); |
PROCEDURE Real* (VAR x: REAL); |
VAR str: STRING; err: BOOLEAN; |
BEGIN |
err := FALSE; |
260,23 → 260,9 |
UNTIL ~Space(str); |
x := StrToFloat(str, err); |
Done := ~err |
END LongReal; |
|
PROCEDURE Real*(VAR x: REAL); |
CONST maxREAL = 3.39E38; |
VAR y: LONGREAL; |
BEGIN |
LongReal(y); |
IF Done THEN |
IF ABS(y) > LONG(maxREAL) THEN |
x := 0.0; |
Done := FALSE |
ELSE |
x := SHORT(y) |
END |
END |
END Real; |
|
|
PROCEDURE Int*(VAR x: INTEGER); |
VAR str: STRING; err: BOOLEAN; |
BEGIN |