我有以下代码:
a = 0.0
b = 0.0
c = 1.0
while a < 300:
a = a + 1
b = b + 1
c = c * b
d = (3**a)
e = (a+1)*c
f = d / e
print a, f
当f变得小于1时,我显示“0”..为什么?
答案 0 :(得分:1)
当f小于1时,我得到&#34; 0&#34;显示
那不是发生了什么。第一次f
小于1时,会打印4.0 0.675
。那不是0
:
1.0 1.5
2.0 1.5
3.0 1.125
4.0 0.675
5.0 0.3375
然后f
的值迅速变为非常小,以Python开始使用科学记数法否定指数:
6.0 0.144642857143
7.0 0.0542410714286
8.0 0.0180803571429
9.0 0.00542410714286
10.0 0.00147930194805
11.0 0.000369825487013
12.0 8.53443431568e-05
13.0 1.82880735336e-05
14.0 3.65761470672e-06
15.0 6.8580275751e-07
请注意-05
,-06
等。f
的值变得非常小,以至于更有效地移动小数点。如果您使用定点表示法格式化这些值,他们会使用更多的零:
>>> format(8.53443431568e-05, '.53f')
'0.00008534434315680000128750276600086976941383909434080'
>>> format(6.8580275751e-07, '.53f')
'0.00000068580275751000002849671038224199648425383202266'
最终,f
对于浮点类型变为太小;浮点值在此之后根本无法接近零:
165.0 5.89639287564e-220
166.0 1.05923225311e-221
167.0 1.89148616627e-223
168.0 3.35766775077e-225
169.0 5.92529603077e-227
170.0 0.0
0.0
之前的最后一个值是5.925,前面有二百二十七个零:
>>> format(5.92529603077e-227, '.250f')
'0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000592529603077000028336751'
它非常接近float
对象可以表示的绝对最小值;请参阅min
attribute of the sys.float_info
named tuple:
>>> import sys
>>> sys.float_info.min
2.2250738585072014e-308
换句话说,您已达到限制,并且5.92529603077e-227
和0.0
之间没有更多可表示的值。