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刚刚达到极限
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:Fraction用floats 分割对象会给我们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)
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |