[M3devel] floating point : problem with Extended.m3
Tony Hosking
hosking at cs.purdue.edu
Sun Apr 3 03:40:02 CEST 2011
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