A quick and dirty cython code is attached
Use:
>> import Float128
>> a = Float128.Float128('1E500')
array([ 1e+500], dtype=float128)
or
>> b = np.float128(1.34) * np.float128(10)**2500
>> b
1.3400000000000000779e+2500
Maybe there is also a way to do it in a pure python code via ctypes?
Nadav
________________________________
From: [email protected] [[email protected]]
On Behalf Of Charles R Harris [[email protected]]
Sent: 30 October 2011 05:02
To: Discussion of Numerical Python
Subject: Re: [Numpy-discussion] Large numbers into float128
On Sat, Oct 29, 2011 at 8:49 PM, Matthew Brett
<[email protected]<mailto:[email protected]>> wrote:
Hi,
On Sat, Oct 29, 2011 at 3:55 PM, Matthew Brett
<[email protected]<mailto:[email protected]>> wrote:
> 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?
To answer my own question - I found an unpleasant way of doing this.
Basically it is this:
def int_to_float128(val):
f64 = np.float64(val)
res = val - int(f64)
return np.float128(f64) + np.float128(res)
Used in various places here:
https://github.com/matthew-brett/nibabel/blob/e18e94c5b0f54775c46b1c690491b8bd6f07eb49/nibabel/floating.py
Best,
It might be useful to look into mpmath. I didn't see any way to export mp
values into long double, but they do offer a number of resources for working
with arbitrary precision. We could maybe even borrow some of their stuff for
parsing values from strings
Chuck
from cython import *
import numpy as np
cimport numpy as np
cdef extern from "stdlib.h":
long double strtold(char* number, char** endptr)
def Float128( char *number):
cdef long double num
cdef np.ndarray[np.longdouble_t, ndim=1] output = np.empty(shape=1,
dtype=np.float128)
num = strtold(number, NULL)
output[0] = num
return output
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion