# [Numpy-discussion] Large numbers into float128

Matthew Brett matthew.brett@gmail....
Sun Oct 30 04:49:56 CDT 2011

```Hi,

On Sun, Oct 30, 2011 at 2:38 AM, Berthold Höllmann
<berthold@xn--hllmanns-n4a.de> wrote:
> Matthew Brett <matthew.brett@gmail.com> writes:
>
>> Hi,
>>
>> Can anyone think of a good way to set a float128 value to an
>> arbitrarily large number?
>>
>> As in
>>
>> v = int_to_float128(some_value)
>>
>> ?
>>
>> I'm trying things like
>>
>> v = np.float128(2**64+2)
>>
>> but, because (in other threads) the float128 seems to be going through
>> float64 on assignment, this loses precision, so although 2**64+2 is
>> representable in float128, in fact I get:
>>
>> In [35]: np.float128(2**64+2)
>> Out[35]: 18446744073709551616.0
>>
>> In [36]: 2**64+2
>> Out[36]: 18446744073709551618L
>>
>> So - can anyone think of another way to assign values to float128 that
>> will keep the precision?
>
> Just use float128 all the was through, and avoid casting to float in
> between:
>
> .>>> "%20.1f"%float(2**64+2)
> '18446744073709551616.0'
> .>>> np.float128(np.float128(2)**64+2)
> 18446744073709551618.0

Ah yes - sorry - that would work in this example where I know the
component parts of the number, but I was thinking in the general case
where I have been given any int.

I think my code works for that, by casting to float64 to break up the
number into parts:

In [35]: def int_to_float128(val):
....:        f64 = np.float64(val)
....:        res = val - int(f64)
....:        return np.float128(f64) + np.float128(res)
....:

In [36]: int_to_float128(2**64)
Out[36]: 18446744073709551616.0

In [37]: int_to_float128(2**64+2)
Out[37]: 18446744073709551618.0

Thanks,

Matthew
```