全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
1973 10
2015-12-14
x = 0
while x != 1:
    print(x)
    x += 0.1

这样一段程序,我想大家应该都能脑补出来执行结果。真的是这样么。运行看看。


本帖隐藏的内容

事实上浮点数在计算机中并不是精确表示的而是近似值。
1/10 = 0.0001100110011 . . .
是无限循环的二进制数
0.1011=1*(1/2)+0*(1/4)+1*(1/8)+1*(1/16)=11/16
所以浮点数使用精确比较是比较危险的(==、!=),要改用不等式(<,<=,>,>=)
再试一试。
另,py2和py3的执行结果有差异。可以从侧面证明py3浮点数上比py2要准确。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-12-15 14:39:00
23333333
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-16 15:37:36
确实陷入到了死循环,看来是浮点精度的问题。while x!= 1.0 可以改为while round(x,1) != 1.0
复制代码

>>> print(x)
1.0
>>> print(x-1.0)
-1.11022302463e-16
>>> print(round(x,1)-1.0)
0.0
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-16 16:15:39
打印0-0.9,然后退出
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-16 19:12:21
python没有强制数据类型
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-17 09:01:42
wangluan 发表于 2015-12-16 15:37
确实陷入到了死循环,看来是浮点精度的问题。while x!= 1.0 可以改为while round(x,1) != 1.0

>>> print ...
!=1 的定义域是不包含1的所有实数。等价变换是>1 或 <1。实际上程序结束循环的条件是=1,所以将不等式变化一下,>=1 或 <=1。你的解决方案是可行的,但是就程序的效率来说,会有很大的不同,首先while的执行效率要比for迭代要快。其次你的while引入了round函数,函数调用退出也比数值直接比较要来的慢。可以用time.time()看一下。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群