[M3devel] floating point : problem with Extended.m3

Tony Hosking hosking at cs.purdue.edu
Sun Apr 3 22:15:00 CEST 2011


On Apr 2, 2011, at 9:52 PM, Mika Nystrom wrote:

> No it's fine with EXTENDED=LONGREAL (well as long as LONGREAL is 64 or 32
> bits).
> 
> I'm really just curious what has to be changed to make EXTENDED not be
> LONGREAL... probably many more things in the compiler?

Yes, definitely.  Compiler and run-time.

> 
>    Mika
> 
> Tony Hosking writes:
>> Are you saying it is broken with EXTENDED=LONGREAL?
>> That is the current implementation.
>> This code is heritage.  Not sure I understand all the implications.
>> 
>> On Apr 2, 2011, at 9:28 PM, Mika Nystrom wrote:
>> 
>>> Hello m3devel (mainly Tony),
>>> 
>>> I believe I've found a problem with float/Common/Extended.m3.
>>> 
>>> Doesn't the code assume that EXTENDED is a multiple of 32 bits wide?
>>> 
>>> That does not seem to me to be a safe assumption... in fact I don't
>>> think it's even safe to round up.  EXTENDED could (and should) be
>>> 10 bytes wide on most machines.  (I am aware that it is currently
>>> the same as LONGREAL, but...)
>>> 
>>>    Mika
>>> 
>>>> UNSAFE MODULE Extended;
>>>> 
>>>> IMPORT Word, Int32;
>>>> 
>>>> PROCEDURE Equal(a, b: T): BOOLEAN =
>>>> BEGIN RETURN a = b END Equal;
>>>> 
>>>> 
>>>> CONST Int32Sz = BYTESIZE(T) DIV BYTESIZE(Int32.T);
>>>> 
>>>> TYPE Int32Arr = ARRAY [0..Int32Sz-1] OF Int32.T;
>>>> 
>>>> PROCEDURE Hash(a: T): Word.T =
>>>> VAR arr := LOOPHOLE(a, Int32Arr); res := 0; BEGIN
>>>>   FOR i := 0 TO LAST(arr) DO
>>>>     res := Word.Xor(res, Int32.Hash(arr[i]))
>>>>   END (* FOR *);
>>>>   RETURN res
>>>> END Hash;
>>>> 
>>>> PROCEDURE Compare(a, b: T): [-1..1] =
>>>> BEGIN
>>>>   IF a < b THEN RETURN -1
>>>>   ELSIF a > b THEN RETURN 1
>>>>   ELSE RETURN 0
>>>>   END (* IF *)
>>>> END Compare;




More information about the M3devel mailing list