Sam Steingold on Sun, 24 Dec 2017 19:18:29 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: t_QUAD printed representation


> * Karim Belabas <Xnevz.Orynonf@zngu.h-obeqrnhk.se> [2017-12-24 15:57:34 +0100]:
> * Sam Steingold [2017-12-22 19:59]:
>
> It's impossible in full generality: floating point numbers are stored
> in binary (64-bit words, say) and output in base 10. Lossless
> conversion between floating point base-10 and base-2^64 is impossible,
> every such involves a rounding error.

This is false mathematically: if you print enough decimal digits,
the number will eventually represent a unique binary float.

Moreover, this is false practically: ANSI CL standard requires that
numbers are printed (machine) readably, and they are, indeed, printed
(machine) readably: 

(= x (read-from-string (prin1-to-string x)))

evaluates to T for any floating number x.

> Those real numbers are "close" but certainly not functionally equivalent.

Yes, but they are _read_ as a functionally equivalent number.

i.e., "0.333333333333333333333333333333" is, of course, a different
number than "1.0/3.0" but _reading_ the string
"0.333333333333333333333333333333" and executing the division "1.0/3.0"
will produce identical numbers.

> No, sorry. The main showstopper is inexact floating point data.

Easily solved, see
http://clhs.lisp.se/Body/02_cbb.htm
http://clhs.lisp.se/Body/22_acac.htm

> Besides that it would be possible BUT detrimental to readability.

Ah, here you have the perennial conflict between human readability and
machine readability.
CL solves it using the variable *PRINT-READABLY*
(http://clhs.lisp.se/Body/v_pr_rda.htm).

> Here are some further examples

Looks like a good case for *PRINT-READABLY*.
Note that I am _not_ suggesting that you change the current default
behavior, just add a user option to print machine readably.

>>>> gequal(gp_read_str(GENtostr_raw(x)),x) = 1
>>>> strcmp(s,GENtostr_raw(gp_read_str(x))) = 0
>>>
>> However, do you agree that, in general, it _should_ hold?
>> ("normatively", not "positively").
>
> Normatively, yes.

Great!

> But it must not make the output harder to read or understand (for the
> majority of users...).

Sure, this just means that "unreadable" output should be marked as such
(cf. http://clhs.lisp.se/Body/02_dht.htm) and the user should be able to
specify whether they want human-readable or machine-readable output.

> So I ask what you actually want to achieve, besides general design
> principles I can agree with :-).

I want to be able to preserve the print/read consistency in CLISP for
PARI objects. They are printed in CLISP as #Z"<return value of
GENtostr_raw>" and read back using gp_read_str().

> For instance we can make 'raw output format' (\o0 or default(output,0)
> NOT the default) output t_QUAD using quadgen() and t_FFELT using
> ffgen().  Would that be useful ? sufficient ? annoying ?

Adding GENtostr_readably that would return a string representation of
GEN that is guaranteed to read using gp_read_str as gidentical to itself
or NULL if such representation is not possible would be perfect.

Thanks.

-- 
Sam Steingold (http://sds.podval.org/) on darwin Ns 10.3.1504
http://steingoldpsychology.com http://www.childpsy.net http://mideasttruth.com
http://www.dhimmitude.org http://jij.org http://no2bds.org http://iris.org.il
Yeah, yeah, I love cats too... wanna trade recipes?