Float Question

R. A. Harmon harmonra at webname.com
Fri Feb 5 21:34:31 UTC 1999


At 10:54 AM 2/4/99 -0600, you wrote:
>>I got most of the Float representation figured out but the following still
>>puzzles me as something special seems to be going on with small floats:
>>
>>            testPrintOn:  Sign    Exponent bits               Mantissa bits
>>    ---     ------------  ----    --------------------------  -------------
>>    2.0     2e1           +       1 (16r400 2r10000000000)    16r0
>>    4.0     4e1           +       2 (16r401 2r10000000001)    16r0
>>    8.0     8e1           +       3 (16r402 2r10000000010)    16r0
[snip]

Oops!  I thought there was some special value coded in the Exponent bits
because I was looking only at the hexadecimal and binary values.  I should
have noticed that the decimal integer just to the left that indicates it's
regular old Float representation.


>>    (1 - (self radix raisedTo: self precision negated))
>>        * (self radix raisedTo: self emax)                <- added parens
>>
>>I never fully understood how this calculation worked.  I think it produces
>>the maximum fraction multiplied by the maximum exponent.  How it produces
>>the maximum fraction has me stumped.
>
>Yes, this is what it does (or attempts to do, anyway): "raisedTo:" is 
>somewhat imprecise, and the final result is off by a few bits.

I think I stumbled across this while looking at intermediate values when I
was trying to understand what it was doing.


>Also, looking at the calculation more closely, it's not designed very well.  
>(2.0 raisedToInteger: 1024) produces Infinity which ruins the rest of the 
>calculation.  I think the best way to do this would be:
>
>(2.0 - (self radix raisedToInteger: (self precision - 1) negated))
>     * (self radix raisedToInteger: self emax)
>
>[where emax == 1023, not 1024]
>
>This calculation is "overflow proof", and returns the correct value, down 
>to the lsb.  It works by multiplying the largest significand (1.99999...) 
>by the largest exponent (2 raisedToInteger: 1023).

You might ought to do like Allen Wirfs-Brock suggested in response to my
ANSI question on c.l.s:

        "While I think this is a great forum for implementors to discuss
         issues related to the ANSI Smalltalk standard I also recommend
        that issues like this be brought to the direct attention of the
        J20 (ANSI Smalltalk) committee so that they might be clarified in
        a future revision of the standard.

        I believe that a mailing list is still maintained at  x3j20 at qks.com.
        Alternatively, you could direct issues to Glenn Krasner, the current
        J20 chair at krasner at objectshare.com."

I'm going to send in a couple of problems I found with the proposed ANSI
standard doc. (a specified invariant that doesn't hold, etc.) just as soon
as I figure out how to subscribe to the list (keep getting qks.com server
down) or to the chair if I get tired of messing with the list.

I don't feel qualified to send in the safer calculation above.


[snip]
>>I thought it might be a good idea to include the following description of
>>Float representation under an "Implementation" heading in the Float class
>>comment.  Let me know if you disagree, or have suggestions to improve to
>>format, or any other comments.
>
>I think that simply specifying that the representation complies with 
>IEEE-754 is sufficient: people who are interested in the implementation 
>details likely know about 754 anyway (which is documented in many places 
>on the web), and if all the details are listed, someone might think that 
>it is done so because there is some sort of difference between that and 
>IEEE-754.

Good point about the possible confusion.

How about adding a note that this is a simplified overview and that one
ought look up the full 754 and comments about it for a full description?

I'm concerned about the person who doesn't have access to the web.  I didn't
until a year ago, and may not be able to afford it in the future.

Also it's a real pain in the butt if you have dial up access to get
connected and go rooting around the web just for a short answer.

I don't want to include all the three gazillion web pages in a Squeak ReadMe
or .doc file, or load them into the image as part of class comments, but
maybe a bit more than the current comment might be a happier medium?

Not a good point:

        "people who are interested in the implementation details
        likely know about 754 anyway"

You should maybe add a parenthetical note: 

        "people (other than those boneheads that try to add ANSI float stuff)
         who are . . . ."

Thanks for help.

--
Richard A. Harmon          "The only good zombie is a dead zombie"
harmonra at webname.com           E. G. McCarthy





More information about the Squeak-dev mailing list