eryksun added the comment:

int(float_version) is returning the actual integer value represented by the 
float, which is the closest approximation possible using an [IEEE 754 
binary64][1], i.e. a C double. Here's one way to compute this value manually:

    from struct import pack
    from fractions import Fraction

    some_number = 1 * 10**44
    float_version = float(some_number)

    n = int.from_bytes(pack('>d', float_version), 'big')
    sign = n >> 63
    exp = ((n >> 52) & (2**11 - 1)) - 1023
    nmantissa = n & (2**52 - 1)
    significand = 1 + sum(Fraction((nmantissa >> (52 - i)) & 1, 2**i)
                          for i in range(52))

    >>> (-1)**sign * significand * 2**exp
    Fraction(100000000000000008821361405306422640701865984, 1)

Or just use the as_integer_ratio method:

    >>> float_version.as_integer_ratio()
    (100000000000000008821361405306422640701865984, 1)

[1]: https://en.wikipedia.org/wiki/Double-precision_floating-point_format

----------
nosy: +eryksun
resolution:  -> not a bug
stage:  -> resolved
status: open -> closed

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25358>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to