# Category:Action! Real Math

### REALMATH.ACT

The following module has been prepared for RosettaCode to provide basic functions and procedures related to floating point numbers which are missing or incorrectly implemented in module REAL.ACT. It is required to run MathInit before using Sqrt procedure or variables half or rzero.

<lang Action!>; The user should call MathInit

before first using of Sqrt procedure

MODULE

INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit

REAL half,rzero

BYTE FUNC RealEqual(REAL POINTER a,b)

``` BYTE ARRAY x,y
```
``` x=a y=b
IF x(0)=y(0) AND x(1)=y(1) AND x(2)=y(2) THEN
RETURN (1)
FI
```

RETURN (0)

BYTE FUNC RealGreaterOrEqual(REAL POINTER left,right)

``` REAL diff
BYTE ARRAY x
```
``` RealSub(left,right,diff)
x=diff
```
``` IF (x(0)&\$80)=\$00 THEN
RETURN (1)
FI
```

RETURN (0)

BYTE FUNC RealGreater(REAL POINTER left,right)

``` IF RealGreaterOrEqual(left,right)=1 AND
RealEqual(left,right)=0 THEN
RETURN (0)
FI
```

RETURN (0)

BYTE FUNC RealLessOrEqual(REAL POINTER left,right)

``` REAL diff
BYTE ARRAY x
```
``` RealSub(right,left,diff)
x=diff
```
``` IF (x(0)&\$80)=\$00 THEN
RETURN (1)
FI
```

RETURN (0)

BYTE FUNC RealLess(REAL POINTER left,right)

``` IF RealEqual(left,right) THEN
RETURN (0)
ELSEIF RealLessOrEqual(left,right) THEN
RETURN (1)
FI
```

RETURN (0)

INT FUNC Round(REAL POINTER r)

``` BYTE ARRAY x
REAL tmp
INT i
```
``` x=r
IF (x(0)&\$80)=0 THEN
i=RealToInt(r)
ELSE
RealAssign(r,tmp)
x=tmp
x(0)==&\$7F
i=-RealToInt(tmp)
FI
```

RETURN (i)

PROC IntToRealForNeg(INT a REAL POINTER r)

``` BYTE ARRAY x
```
``` IF a>=0 THEN
IntToReal(a,r)
ELSE
IntToReal(-a,r)
x=r
x(0)==%\$80
FI
```

RETURN

BYTE FUNC IsNegative(REAL POINTER r)

``` BYTE ARRAY x
```
``` x=r
IF (x(0)&\$80)=\$80 THEN
RETURN (1)
FI
```

RETURN (0)

INT FUNC Floor(REAL POINTER x)

``` REAL tmp
```
``` IF RealEqual(x,rzero) THEN
RETURN (0)
FI
RealSub(x,half,tmp)
```

RETURN (Round(tmp))

INT FUNC Ceiling(REAL POINTER x)

``` REAL tmp
```
``` IF RealEqual(x,rzero) THEN
RETURN (0)
FI
```

RETURN (Round(tmp))

PROC Trunc(REAL POINTER x,res)

``` BYTE ARRAY b
BYTE exp
```
``` RealAssign(x,res)
b=res
exp=b(0)&\$7F
IF exp<=67 THEN
b(5)=0
IF exp<=66 THEN b(4)=0 FI
IF exp<=65 THEN b(3)=0 FI
IF exp<=64 THEN b(2)=0 FI
IF exp<=63 THEN b(0)=0 b(1)=0 FI
FI
```

RETURN

PROC Frac(REAL POINTER x,res)

``` REAL t
```
``` Trunc(x,t)
RealSub(x,t,res)
```

RETURN

PROC RealDivInt(REAL POINTER x,n,res)

``` REAL r
```
``` RealDiv(x,n,r)
Trunc(r,res)
```

RETURN

PROC RealMod(REAL POINTER x,n,res)

``` RealDivInt(x,n,res)
RealMult(res,n,res)
RealSub(x,res,res)
```

RETURN

PROC Sqrt(REAL POINTER a,b)

``` IF RealEqual(a,rzero) THEN
RealAssign(rzero,b)
ELSE
Power(a,half,b)
FI
```

RETURN

PROC RealAbs(REAL POINTER a,b)

``` BYTE ARRAY x
```
``` RealAssign(a,b)
x=b
x(0)=x(0) & \$7F
```

RETURN

PROC RealAbsDiff(Real POINTER a,b,diff)

``` BYTE ARRAY x

RealSub(a,b,diff)
x=diff
x(0)=x(0) & \$7F
```

RETURN

PROC MathInit()

``` IntToReal(0,rzero)
ValR("0.5",half)
```

RETURN

MODULE</lang>

## Pages in category "Action! Real Math"

The following 33 pages are in this category, out of 33 total.