This page describes the new floating-point features in Version 2.3 of uLisp for 32-bit processors.
The implementation uses 32-bit floats with a 24-bit mantissa and 8-bit exponent, giving a maximum value of approximately 3.402823 × 1038.
Size and performance
The code size of the floating-point version of uLisp is approximately double the integer version. However, all the supported platforms have enough flash memory space that this not an issue.
The performance of the floating-point version is identical to the integer version; for example, the tak benchmark runs in 7 seconds with version 2.3 on an Arduino Due, which is the same as for the integer version 2.2. For this reason I've decided not to maintain a separate integer-only version of 32-bit uLisp, and all future releases will include floating-point support.
The existing functions have been updated, where appropriate, to handle floating-point numbers in a sensible way. Where possible routines return an exact integer; for example:
> (expt 3 19) 1162261467 > (expt 3 20) 3.48679e+09
Some functions are extended to take advantage of floating point. For example, if the argument to random is a floating-point number the function will return a random float between 0 and that number:
> (random 1.5) 1.36925
There are several new functions for working with floating-point numbers:
sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, exp, log, sqrt, expt
ceil, floor, round, truncate
For a full description of the new functions see Floating-point extensions.
For examples of using the floating-point features see Fast Fourier Transform. I hope to add some further examples in the near future.
I'm very grateful to Steve Losh who developed an initial version of uLisp with floating-point support.