当计算结果小于1时,为什么python显示0?

时间:2017-01-07 15:13:33

标签: python variables floating-point

我有以下代码:

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”..为什么?

1 个答案:

答案 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-2270.0之间没有更多可表示的值。