Hi,
Maybe we'd use some conditional initializiation, checking for the properties of
the number, like the following:
// The definition of Epsion and MinValue differ between .NET and
Python/C,
// so we need to define our own values.
// Approx. -2.2204460492503131e-16 - the byte order reversed value is
approx.
// 2.2290265677773679e-319, so this code delivers the correct value
independently
// of the byte order of the machine.
private static readonly double EPSILON = Math.Max(
System.BitConverter.Int64BitsToDouble(0x3cb0000000000000),
System.BitConverter.Int64BitsToDouble(0x000000000000b03c));
// Approx. 2.2250738585072014e-308 - the byte-order reversed value is
approx.
// 2.0236928853657458e-320, so this code delviers the correct value
independently
// of the byte order of the machine.
private static readonly double MIN = Math.Max(
System.BitConverter.Int64BitsToDouble(0x0010000000000000),
System.BitConverter.Int64BitsToDouble(0x0000000000001000));
public static floatinfo float_info = new floatinfo(Double.MaxValue,
1024, 308, MIN, -1021, -307, 15, 53, EPSILON, 2, 1);
This trick relies on the fact that for the given values, the reversed byte
order produces an zero-Exponent, which are denormalized numbers, and in both
cases, the wanted number is a normalized one which (by definition) is larger
than the denormalized one.
This code is as elegant as checking for the endianness explicitly, and we are
even safe for machines where the integer and float endianness are different
(see https://en.wikipedia.org/wiki/Endianness#Floating-point_and_endianness -
although I doubt that those hardware is relevant for our user base...) :)
Best regards
Markus Schaber
CODESYS(r) a trademark of 3S-Smart Software Solutions GmbH
Inspiring Automation Solutions
________________________________
3S-Smart Software Solutions GmbH
Dipl.-Inf. Markus Schaber | Product Development Core Technology
Memminger Str. 151 | 87439 Kempten | Germany
Tel. +49-831-54031-979 | Fax +49-831-54031-50
E-Mail: [email protected]<mailto:[email protected]> | Web:
codesys.com<http://www.codesys.com> | CODESYS store:
store.codesys.com<http://store.codesys.com>
CODESYS forum: forum.codesys.com<http://forum.codesys.com>
Managing Directors: Dipl.Inf. Dieter Hess, Dipl.Inf. Manfred Werner | Trade
register: Kempten HRB 6186 | Tax ID No.: DE 167014915
Von: Slide [mailto:[email protected]]
Gesendet: Mittwoch, 8. Mai 2013 22:44
An: Jeff Hardy
Cc: Markus Schaber; Curt Hagenlocher; [email protected]
Betreff: Re: [Ironpython-users] IronPython float_info values (was: IronPython
always in 32-bit mode on 64bit machine even when running ipy64.exe)
Unless Microsoft really wants pain and anguish, they are likely running in
little endian mode. I've never run across an ARM setup that actually runs in
big endian (nor do I want to), so I'm pretty sure its little endian. I'd be
more than willing to test an app on my phone since Windows Phone is crap
anyway, so you couldn't damage it any worse than it is now :-)
Alex
On Wed, May 8, 2013 at 12:54 PM, Jeff Hardy
<[email protected]<mailto:[email protected]>> wrote:
On Wed, May 8, 2013 at 9:15 AM, Markus Schaber
<[email protected]<mailto:[email protected]>> wrote:
> Hi,
>
>
>
> The main problem for now is that I can't test whatever solution we find,
> because I don't have access to any hardware with non-intel Byte Order and a
> Microsoft .NET. (I don't want to rely on Mono for this test...)
Is ARM big-endian? If so, any Windows 8 ARM tablet (i.e. Surface RT)
or Windows Phone should do. Heck, even the emulator might do. It
shouldn't be too hard to whip up an app that prints those two values,
and I think Alex has a Windows Phone if he'd be willing to test it.
If ARM is little-endian (or Windows/ARM runs in little-endian mode)
then I don't think it matters; we'd have to try Mono on a PowerPC or
something like that.
- Jeff
--
Website: http://earl-of-code.com
_______________________________________________
Ironpython-users mailing list
[email protected]
http://mail.python.org/mailman/listinfo/ironpython-users