我有一个Python float
,我想要float
这是1 ULP s越来越小。Python是否具有与java.lang.Math.nextUp等效的功能?
在Java中,我会用Math.nextUp(x)
和Math.nextAfter(x, Double.NEGATIVE_INFINITY)
来做到这一点。
有没有办法在Python中做到这一点?我想用math.frexp
and math.ldexp
自己来实现它,但据我所知Python没有指定浮点类型的大小。
我有一个Python float
,我想要float
这是1 ULP s越来越小。Python是否具有与java.lang.Math.nextUp等效的功能?
在Java中,我会用Math.nextUp(x)
和Math.nextAfter(x, Double.NEGATIVE_INFINITY)
来做到这一点。
有没有办法在Python中做到这一点?我想用math.frexp
and math.ldexp
自己来实现它,但据我所知Python没有指定浮点类型的大小。
我不确定这是不是你想要的,但是sys.float_info.epsilon
是“1和大于1的最小值之间的差值”,你可以做x * (1 + sys.float_info.epsilon)
。
这是一个相关的想法,但不正是我想要的。从本质上说,0的指数是正确的,但对于较小的指数它太大,对于较大的指数太小。感谢您指出'sys.float_info'。至少在这种结构下,我可以可靠地确定底层浮点类型的大小,即使我仍然必须猜测它是IEEE-754。有了这个,我可以根据@Benjamin的建议,特别是结构模块,制定解决方案。 – rlibby 2011-04-22 02:38:50
'x + epsilon'?那不就是'x *(1 + epsilon)'吗? – vartec 2011-04-22 14:34:54
@vartec我不知道,但我在答案中纠正了它。 – 2011-04-23 23:37:16
你可以看看如何Decimal.next_plus()
/Decimal.next_minus()
实现:
>>> from decimal import Decimal as D
>>> d = D.from_float(123456.789)
>>> d
Decimal('123456.789')
>>> d.next_plus()
Decimal('123456.789')
>>> d.next_minus()
Decimal('123456.789')
>>> d.next_toward(D('-inf'))
Decimal('123456.789')
确保decimal context有你需要的值:
>>> from decimal import getcontext
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
capitals=1, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
的替代品:
呼叫C99 nextafter()
使用:
>>> import ctypes
>>> nextafter = ctypes.CDLL(None).nextafter
>>> nextafter.argtypes = ctypes.c_double, ctypes.c_double
>>> nextafter.restype = ctypes.c_double
>>> nextafter(4, float('+inf'))
4.000000000000001
>>> _.as_integer_ratio()
(4503599627370497, 1125899906842624)
使用numpy
:
>>> import numpy
>>> numpy.nextafter(4, float('+inf'))
4.0000000000000009
>>> _.as_integer_ratio()
(4503599627370497, 1125899906842624)
尽管不同repr()
,结果是一样的。
如果我们忽略的边缘情况,然后从@S.Lott answer作品简单frexp/ldexp解决方案:
>>> import math, sys
>>> m, e = math.frexp(4.0)
>>> math.ldexp(2 * m + sys.float_info.epsilon, e - 1)
4.000000000000001
>>> _.as_integer_ratio()
(4503599627370497, 1125899906842624)
pure Python next_after(x, y)
implementation by @Mark Dickinson,考虑到边缘情况。结果在这种情况下是相同的。
同样的问题在这里问:http://bytes.com/topic/python/answers/739926-next-float,具有很好的答案... – Benjamin 2011-04-21 20:05:35