This is an analysis of the R5RS provision that the full numeric tower may be subsetted. In this analysis, four boolean feature settings characterize different kinds of numeric towers: `exactness-preserving`

, `ratios`

, `inexact`

, and `complex`

. These refer respectively to the closure of exact numbers under rational operations (except `/`

), exact non-integer values, inexact rationals, and non-real numbers.

There are therefore 16 possible numeric towers. 9 of them are known to have implementations, as shown below. I write `+`

if a feature is present and `-`

if it is absent, and give a general description of the resulting tower and some Scheme implementations that provide it.

`exactness-preserving` |
`ratios` |
`inexact` |
`complex` |
Description | Implementations |
---|---|---|---|---|---|

- | - | - | - | Bounded exact integers only | !SigScheme†, MiniScheme† |

- | - | + | - | Fixnums and flonums | Plain Chicken 4, Shoe†, TinyScheme†, RScheme, JScheme†, SIOD, BDC†, XLisp†, Schemik†, VX, SXM†, Inlab, Llava, Sixx, Picrin†, Sizzle, Dfsch†, Stalin (also Elisp†, C†) |

- | + | + | + | Limited-range exact and inexact numbers | S7, Wraith |

+ | - | + | - | Exact integers and inexact real numbers | Bigloo, Scheme 9, Unlikely Scheme††, Elk (also ISLisp) |

+ | - | + | + | Exact integers, inexact real numbers, and complex numbers | SCM, Cyclone |

+ | + | - | - | Exact rational numbers only | Dream, Oaklisp |

+ | + | - | + | Exact numbers only | Owl Lisp |

+ | + | + | - | Real numbers only | Psyche, Ikarus, Rep, Dfsch (also Clojure) |

+ | + | + | + | Full numeric tower | Racket, Gauche, MIT, Gambit, Chicken 4 with the `numbers` egg, Chicken 5, Scheme48/scsh, Kawa, SISC, Chibi, Guile, Chez, Vicare, Larceny, Ypsilon, Mosh, IronScheme, STklos, KSi, UMB, Spark, Sagittarius (also R6RS, Common Lisp, Pure) |

†These systems are technically exactness-preserving, but silently return the wrong answers when their arithmetic operations overflow. This makes them non-conformant.

††This system provides ratios, but they are so buggy as to be useless: `(/ 1 3)`

=> 3/7.

NexJ's numeric tower is undocumented and behaves inconsistently in any case: applying `expt`

to two fixnums, for example, returns a bignum, but adding them returns a potentially incorrect fixnum. Basically it does what Java does.

See also: Complex representations for information on which Schemes support exact, inexact, and mixed-exactness complex numbers.

See also: Float precision for information on the different precisions of inexact numbers that some Schemes support.