# fixed

#### Fixed point number package

- raw README.md
- raw fixed_lmi.scr
- raw fixed_lmi.txt
- raw fixed_sf.f
- raw fixed_vfx.fth
- raw glossary.md
- raw license.txt
- raw package.4th

# FIXED

Fixed point number package

Dr. Heinrich Hohl <hohl@isartext.de>

Version 1.0.0 - 2016-10-01

## Introduction

This package provides words for convenient handling of fixed point numbers.

A fixed point number (f) is an integer number with an implied decimal point at a specified position. Fixed point numbers may be used instead of floating point numbers if only basic arithmetic operations (+, -, *, /) are required in an application.

What does *implied decimal point* mean?

Let us assume that your application deals with weight (in kg) and price (in EUR). In this case you would store weights and prices as follows:

- Weight: 1 kg = 1.000 kg = 1000 g = 1000
- Price: 1 EUR = 1.00 EUR = 100 ct = 100

Although weight and price are officially shown in kg and EUR, they are internally stored in grams and cents. Before you input or output a fixed point number, you must specify the position of the implied decimal point. In the above example these positions are 3 and 2 digits from the right, respectively.

## Versions

The package is available in versions for the following FORTH systems:

System | Standard | Type | Files |
---|---|---|---|

PC/FORTH (LMI) | Forth-83 | 16-bit | fixed_lmi.txt |

SwiftForth (Forth, Inc.) | ANS Forth | 32-bit | fixed_sf.f |

VFX Forth (MPE) | ANS Forth | 32-bit | fixed_vfx.fth |

The package was developed under LMI PC/FORTH in 1992 and published in the German Forth magazine Vierte Dimension Nr. 2/1992, p.7. The LMI version is included for completeness and because someone might still want to use the package on a 16-bit system.

It is also instructive to see how much simpler the code became after rewriting the package for 32-bit systems. The following description will concentrate on the 32-bit versions (SwiftForth, VFX Forth) of the package.

## Installation

Use the following commands to install the package:

- SwiftForth:
`INCLUDE fixed_sf.f`

- VFX Forth:
`INCLUDE fixed_vfx.fth`

This makes the fixed point words available. After loading you still have a standard system. The number conversion routine of the Forth system is not modified by this package.

## Glossary

The package adds the following words to the system:

`PLACES FIXED (F.) F. F.R`

See **glossary.md** for stack comments and descriptions of the defined words.

## Usage

Use `PLACES`

to specify the number of places behind the decimal point. Input a number (with or without decimal point), immediately followed by `FIXED`

which converts the input to a fixed point number. It does this by appending zeros or by truncating excessive digits behind the decimal point as required. The number is now in a well defined format and can be stored, used for calculations, or output.

### Examples

```
3 PLACES
6 FIXED F. --> 6.000 ok
2.4938 FIXED F. --> 2.493 ok
6 FIXED 2.4938 FIXED + F. --> 8.493 ok
8.493 1 PLACES F. --> 8.4 ok
: .WEIGHT ( f -- ) 3 PLACES F. ;
: .PRICE ( f -- ) 2 PLACES F. ;
```

### Important rules

Do not put any other words between the number input routine and

`FIXED`

. Depending on the FORTH system, words such as`.S`

may alter the contents of`DPL`

.On 32-bit systems, fixed point numbers are represented by single length numbers.

Use standard words for storage (

`@ ! CONSTANT VALUE VARIABLE`

) and for stack manipulation (`DUP DROP SWAP OVER ROT`

etc.)Use

`+`

and`-`

to add and subtract two fixed point numbers, respectively. Both operands must be based on the same number of places, and the result will inherit this number of places.Use

`*`

and`/`

to multiply or divide two fixed point numbers. The operands and the result are generally based on different numbers of places. Afterward, you must scale the result by a suitable power of ten.

## Conformance

This package largely conforms to Forth-83 (LMI) and ANS Forth (SwiftForth, VFX). Nonstandard words that should be mentioned:

`DPL`

contains the decimal point location after an integer number conversion has been performed`{ ... }`

marks block comments in SwiftForth`(* ... *)`

marks block comments in VFX Forth`PACKAGE PRIVATE PUBLIC END-PACKAGE`

are used for information hiding in SwiftForth`MODULE EXPORT END-MODULE`

are used for information hiding in VFX Forth

## by HeinrichHohl

### Versions

### Tags

ansforth94, forth-94, lmi-forth, swiftforth, vfx-forth, forth-83, tools, fixed-point-arithmetic

### Dependencies

*None*

### Dependents

*None*