Floats and Integers
Division between integers in Shen will yield a float if the divisor is not a whole divisor
of the numerator. In some languages, e.g. Python, (/ 3 2) gives 1 (integer division) and not 1.5.
It was argued as to whether Shen should follow suit. It was felt that in such cases it was more
intuitive to return an answer with a fractional component - most people would consider 3/2 = 1 as
false and for people using Shen to do wages calculations etc. 'street' division is more appealing.
An interesting question concerns the comparison of floats and integers is (= 1 1.0) true or
not? Mathematically the decimal notation is simply a shorthand for a sum.
i.e. 1.0 = (1 x 100) + (0 x 10-1) = 1
Therefore if '=' represents identity then '(= 1 1.0)' is true. In Shen '(= 1 1.0)' is true
(as in Common Lisp, '(= 1 1.0)' returns T) and 1.0 entered to the top level is returned as 1.
Effectively a float is parsed as a sum of products i.e. 1.23 = (1 x 100) + (2 x 10-1)
+ (3 x 10-2).
E numbers are parsed similarly i.e. 1.23e2 = ((1 x 100) + (2 x 10-1) + (3 x 10-2)) x 102
A contrary approach is taken in Prolog where '1 = 1.0' is false. In ML the comparison is
meaningless (returns an error) because 1.0 and 1 belong to different types - real and int. This is wrong.
Computing has fogged the issues here and committed the traditional error of confusing use and mention
in its treatment of integers and floats, in other words, between numbers and the signs we use to represent
them. We should not confuse the identity of two numbers with the identity of their representation. If we
want to say that 1.0 is not an integer and 1 is, we commit an error, because 1.0 = 1; unless we mean by
'integer' an expression which is applied to the representation itself (as in the BNF above) i.e. '1.0'.
In which case the expression 'integer' is predicated of something which is a numeral, in computing terms,
a string. In Shen, the 'integer?' test is taken as predicating of numbers and 1.0 is treated as an integer.
The integer test in Shen runs in log time and is predicated on the following 'equations'
integer - integer = integer
non-integer - integer = non-integer
These 'equations', though mathematically true, can fail outside a certain range (commonly beyond 15 digits)
which depends on the precision of the platform and therefore the accuracy of this test depends on the precision
of the arithmetic. Thus we recommend that Shen be installed with at least double precision which gives accuracy
up to 15 digits. |