[Mono-list] Mono and .Net Floating Point Inconsistencies

Kornél Pál kornelpal at gmail.com
Mon Jan 19 02:29:34 EST 2009


Hi,

I've filed a bug report for this:
https://bugzilla.novell.com/show_bug.cgi?id=467201

Kornél

2009/1/19 ddambro <ddambro at gmail.com>:
>
> I get the same results using Kornél's code.  Using Robert's code compiled as
> x86, run on various machines, OSes, and runtimes, I get the byte values as:
>
> .NET:
> 169
> 192
> 42
> 63
>
> mono:
> 168
> 192
> 42
> 63
>
> So if this is a rounding issue, is there any way to get the two to round the
> same?  I think I've pretty much eliminated John's FPU suggestion as I went
> through all the rounding flags and none of them matched .NET, and this issue
> occurs in both Windows and Linux.
>
>
>
> Kornél Pál wrote:
>>
>> Hi,
>>
>> This seems to me a float32 rounding problem because when using float64 I
>> get the same results.
>>
>> Code:
>>
>> using System;
>>
>> class Testing
>> {
>>      public static void Main()
>>      {
>>          float f1 = 0;
>>          f1 += -0.7779751f;
>>
>>       Console.Write("0x");
>>       foreach (byte b in BitConverter.GetBytes(f1))
>>               Console.Write (b.ToString("x2"));
>>       Console.WriteLine();
>>          Console.WriteLine(f1.ToString("R"));
>>
>>          f1 += -1f * -1.42317927f;
>>
>>       Console.Write("0x");
>>       foreach (byte b in BitConverter.GetBytes(f1))
>>               Console.Write (b.ToString("x2"));
>>       Console.WriteLine();
>>          Console.WriteLine(f1.ToString("R"));
>>
>>          f1 += -1.30905056f * 0.241778925f;
>>
>>       Console.Write("0x");
>>       foreach (byte b in BitConverter.GetBytes(f1))
>>               Console.Write (b.ToString("x2"));
>>       Console.WriteLine();
>>          Console.WriteLine(f1.ToString("R"));
>>
>>          f1 = (2.0F / (1.0F + (float)Math.Exp(-4.9F * f1))) - 1.0F;
>>
>>       Console.Write("0x");
>>       foreach (byte b in BitConverter.GetBytes(f1))
>>               Console.Write (b.ToString("x2"));
>>       Console.WriteLine();
>>          Console.WriteLine(f1.ToString("R"));
>>      }
>> }
>>
>> The last value is different indeed (I only thested on Windows):
>> MS:
>> 0xa9c02a3f
>> 0,667002261
>>
>> Mono:
>> 0xa8c02a3f
>> 0,6670022
>>
>> Hex value is different for me as well.
>>
>> Kornél
>>
>> Robert Jordan wrote:
>>> ddambro wrote:
>>>> Hi,
>>>>
>>>> I was fairly sure the code had executed.  As I mentioned, different
>>>> flags in
>>>> the C code caused errors in the program.  Just to be sure though, I
>>>> threw in
>>>> some fprintf statements to stderr into setFloats() and they printed
>>>> properly, so the code was definitely executed.
>>>>
>>>> Thankfully I have been able to come up with some code that shows at
>>>> least
>>>> one example of the inconsistencies I've been talking about.  Here it is:
>>>
>>> It's just a string representation mismatch, as this code reveals the
>>> same bits:
>>>
>>>          Console.WriteLine(f1.ToString("R"));
>>>
>>>      foreach (byte b in BitConverter.GetBytes(f1))
>>>              Console.WriteLine (b);
>>>
>>> Robert
>>>
>>> _______________________________________________
>>> Mono-list maillist  -  Mono-list at lists.ximian.com
>>> http://lists.ximian.com/mailman/listinfo/mono-list
>>>
>> _______________________________________________
>> Mono-list maillist  -  Mono-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-list
>>
>>
>
> --
> View this message in context: http://www.nabble.com/Mono-and-.Net-Floating-Point-Inconsistencies-tp21428695p21537058.html
> Sent from the Mono - General mailing list archive at Nabble.com.
>
> _______________________________________________
> Mono-list maillist  -  Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>


More information about the Mono-list mailing list