On Tue, Oct 11, 2011 at 12:17 PM, Matthew Brett <matthew.br...@gmail.com>wrote:
> Hi, > > While struggling with floating point precision, I ran into this: > > In [52]: a = 2**54+3 > > In [53]: a > Out[53]: 18014398509481987L > > In [54]: np.float128(a) > Out[54]: 18014398509481988.0 > > In [55]: np.float128(a)-1 > Out[55]: 18014398509481987.0 > > The line above tells us that float128 can exactly represent 2**54+3, > but the line above that says that np.float128(2**54+3) rounds upwards > as if it were a float64: > > In [59]: np.float64(a) > Out[59]: 18014398509481988.0 > > In [60]: np.float64(a)-1 > Out[60]: 18014398509481988.0 > > Similarly: > > In [66]: np.float128('1e308') > Out[66]: 1.000000000000000011e+308 > > In [67]: np.float128('1e309') > Out[67]: inf > > Is it possible that float64 is being used somewhere in float128 casting? > > The problem is probably in specifying the values. Python doesn't support long double and I expect python integers to be converted to doubles, then cast to long double. The only way to get around this is probably using string representations of the numbers, and I don't know how well/consistently numpy does that at the moment. If it calls python to do the job, then double is probably what is returned. It doesn't help on my system: In [1]: float128("18014398509481987.0") Out[1]: 18014398509481988.0 Chuck
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion