你是正确的,你的方法没有返回一些数字。1.0
例如, and之间没有浮点数1.0000000000000002
,但是10**1.0000000000000002
is ,并且and :和10.000000000000005
之间有两个数。你的算法永远不会返回这两个数字。10.0
10.000000000000005
10.000000000000002
10.000000000000004
但是您可以作弊并使用Decimal
以更精确地取幂:
>>> float(10 ** Decimal('1'))
10.0
>>> float(10 ** Decimal('1.0000000000000001'))
10.000000000000002
>>> float(10 ** Decimal('1.00000000000000015'))
10.000000000000004
>>> float(10 ** Decimal('1.0000000000000002'))
10.000000000000005
因此,arbitrary
需要生成Decimal
足够精度的随机指数并将它们用作指数。假设 64 位二进制数字对于指数来说足够精确,代码将如下所示:
import sys, random
from decimal import Decimal
def _random_decimal(minval, maxval, added_prec):
# generate a Decimal in the range [minval, maxval) with the
# precision of additional ADDED_PREC binary digits
rangelen = maxval - minval
denom = rangelen << added_prec
return minval + Decimal(rangelen) * random.randrange(denom) / denom
def arbitrary():
min_exp = sys.float_info.min_exp - sys.float_info.mant_dig
max_exp = sys.float_info.max_exp
return float(2 ** _random_decimal(min_exp, max_exp, 64))