That was my other thought. I guess I was expecting the number to be rounded
or truncated, but I will review the IEEE standard.

-Kevin

On Thu, Dec 9, 2021 at 2:44 AM Alexander Burger <a...@software-lab.de> wrote:

> Hi Kevin,
>
> > I'm getting strange results with the following:
> > ...
> > : (scl 16)
> > -> 16
> > : (setq Ptr (%@ "malloc" 'P 4))
> > -> 9674752
> > : (struct Ptr NIL (list -1.0 1280.0))
> > -> NIL
> > : (format (car (struct Ptr '(-1.0 . 1))) *Scl)
> > -> "-103.5058256155770880"
> > ...
> > The value seems completely off; the examples for 'struct work fine.
>
> It is a floating point range problem.
>
>
> The IEEE 'float' type cannot support such high precision (16 digits).
>
> If you do
>
>    (setq Ptr (%@ "malloc" 'P 4))
>    (scl 7)
>    (format (struct Ptr -1.0 (-1.0 123.0)) *Scl)
>    -> "123.0000000"
>
> it works fine, but for higher scales it more and more disintegrates, as in
> your
> example above.
>
>
> Using IEEE 'double' helps for a while
>
>    (setq Ptr (%@ "malloc" 'P 8))
>    (scl 15)
>    (format (struct Ptr 1.0 (1.0 123.0)) *Scl)
>    -> "123.000000000000000"
>
> but no longer for 16
>
>    (scl 16)
>    (format (struct Ptr 1.0 (1.0 123.0)) *Scl)
>    -> "7.7078495393153024"
>
> ☺/ A!ex
>
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>

Reply via email to