[squeak-dev] Horrible problem?

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Sat Mar 3 11:43:15 UTC 2012


Le 3 mars 2012 12:02, Bob Arning <arning315 at comcast.net> a écrit :
> The comment says: "If they are not these values (accounting for precision of
> printing)..."
>
> So it looks like the writer of the comment was allowing for just what
> occurred for you, the precision to which the numbers was printed having
> changed. It looks like there was a change made to Float>>absPrintOn:base: in
> 2010 (well after the Random test was written) that may have led to this
> difference.
>
> Cheers,
> Bob
>

No, I don't think the 2010 edition did change printing.
The printing changed in 1998 when the scheme method for printing a
Float accurately was introduced in Squeak.

Now, the absPrintOn:base: still is inexact.
That means I have this test failure:

| a b |
a := Float pi.
b := a predecessor.
self assert: a ~= b ==> [a printString ~= b printString].

Two different Float can have same printString representation.
Consequently, of course you can't reconstruct a Float from its
printString representation.

| a b |
a := Float pi.
b := a predecessor.
self assert: (Float readFromString: b printString) = b.

To correct these bad properties, I proposed to use
absPrintExactlyOn:base: and there is a mcz in the inbox to that aim.
Until then, never ever base such tests on printString representation.
Currently storeString prints a Float "exactly"

Float pi predecessor printString '3.141592653589793'
Float pi predecessor storeString '3.1415926535897927'

Also note that "exactly" is a misnomer.
absPrintExactlyOn:base: prints the SHORTEST decimal form that would be
converted back to the same Float, not the EXACT one.

Since a Float internal representation is a Fraction with a power of 2
at denominator, it can be printed exactly in base 10 (or any other
even basis) with a finite number of digits.
So the EXACT representation is

Float pi predecessor asFraction asScaledDecimal
 3.141592653589792671908753618481568992137908935546875s51

Of course it's rather a good thing to print the shortest form:

0.1 storeString
->'0.1'

0.1 asFraction asScaledDecimal
-> 0.1000000000000000055511151231257827021181583404541015625s55

Nicolas

>
> On 3/3/12 3:43 AM, 강진오 wrote:
>
> Hello.
> I have a question.
> I tested Random class>>theItsCompletelyBrokenTest to test my system.
> The comment of the method says that my system would be horrible if the
> result is not these values:
> #(0.149243269650845 0.331633021743797 0.75619644800024 0.393701540023881
> 0.941783181364547 0.549929193942775 0.659962596213428 0.991354559078512
> 0.696074432551896 0.922987899707159)
>
> but my result was more precious:
> #(0.1492432696508445 0.331633021743797 0.756196448000239 0.3937015400238808
> 0.941783181364547 0.549929193942775 0.659962596213428 0.991354559078512
> 0.696074432551895 0.922987899707159)
>
> Is it because my system has errors or the comment is obsolete or incorrect?
>
>
>
>
>


More information about the Squeak-dev mailing list