经过太多分歧后,Python会变为0.0

Nat*_*ate 3 python division python-3.x

所以,我有以下代码:

    half= 1/2.0
    print(half)
    for x in range(1,1075):
        half=half/2.0
        print(half)
Run Code Online (Sandbox Code Playgroud)

但是在循环的最后部分,python决定一半现在是0.0

    1.265e-321
    6.3e-322
    3.16e-322
    1.6e-322
    8e-323
    4e-323
    2e-323
    1e-323
    5e-324
    0.0
Run Code Online (Sandbox Code Playgroud)

我达到了python的限制吗?我是否需要安装一个包装才能更远?我不确定为什么会发生这种情况,但我认为python刚刚达到极限

Aza*_*kov 5

TLDR:尝试Fraction

half = Fraction(1, 2)
for x in range(1, 1075):
    half = half / 2
    print(half)
Run Code Online (Sandbox Code Playgroud)

会给

1/4
1/8
...
1/202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784
1/404804506614621236704990693437834614099113299528284236713802716054860679135990693783920767402874248990374155728633623822779617474771586953734026799881477019843034848553132722728933815484186432682479535356945490137124014966849385397236206711298319112681620113024717539104666829230461005064372655017292012526615415482186989568
Run Code Online (Sandbox Code Playgroud)

你可以找出最小可用正float

>>> import sys
>>> sys.float_info.min
2.2250738585072014e-308
Run Code Online (Sandbox Code Playgroud)

然后按照你的例子我们会发现

>>> 2 * sys.float_info.min > pow(2, -1074)
True
Run Code Online (Sandbox Code Playgroud)

即下一个除以2似乎小于最小可用正数float.

顺便说一下他们的差别等于

>>> diff = 2 * sys.float_info.min - pow(2, -1074)
>>> diff
4.4501477170144023e-308
Run Code Online (Sandbox Code Playgroud)

但有趣的是

>>> diff == 2 * sys.float_info.min
False
Run Code Online (Sandbox Code Playgroud)

>>> diff / 2 == sys.float_info.min
True
Run Code Online (Sandbox Code Playgroud)

PS:Fractionfloats 分割对象会给我们float

>>> half = Fraction(1, 2)
>>> half = half / 2.0
>>> type(half)
<class 'float'>
Run Code Online (Sandbox Code Playgroud)

所以你的代码除以2.0将给出相同的结果,并且为了正确使用Fractions,你应该用ints或其他Fraction类似的方法加/减/除/乘

half = Fraction(1, 2)
for x in range(1, 1075):
    half = half / Fraction(2.0)
    print(half)
Run Code Online (Sandbox Code Playgroud)

PPS:有一个关于使用下划线作为未使用对象的名称的约定,因此最好编写

half = Fraction(1, 2)
for _ in range(1, 1075):
    half = half / 2
    print(half)
Run Code Online (Sandbox Code Playgroud)