楼主: igs816
2008 10

[讨论交流] python 的一个小问题 [推广有奖]

已卖:261231份资源

泰斗

6%

还不是VIP/贵宾

-

威望
9
论坛币
1762899 个
通用积分
20526.3063
学术水平
2754 点
热心指数
3477 点
信用等级
2565 点
经验
485149 点
帖子
5457
精华
52
在线时间
3907 小时
注册时间
2007-8-6
最后登录
2025-12-25

高级学术勋章 特级学术勋章 高级信用勋章 特级信用勋章 高级热心勋章 特级热心勋章

楼主
igs816 在职认证  发表于 2015-12-14 23:21:24 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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要准确。

二维码

扫码加我 拉你入群

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

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

关键词:python 小问题 print while hide python

已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 22 + 22 精彩帖子

总评分: 经验 + 22  论坛币 + 22   查看全部评分

沙发
guminaq 发表于 2015-12-15 14:39:00
23333333

藤椅
wangluan 发表于 2015-12-16 15:37:36
确实陷入到了死循环,看来是浮点精度的问题。while x!= 1.0 可以改为while round(x,1) != 1.0
  1. >>> x = 0
  2. >>> for i in range(0,10):
  3.         print(x)
  4.         x += 0.1

  5. 0
  6. 0.1
  7. 0.2
  8. 0.3
  9. 0.4
  10. 0.5
  11. 0.6
  12. 0.7
  13. 0.8
  14. 0.9
  15. >>> print(x)
  16. 1.0
  17. >>> print(x - 1.0)
  18. -1.11022302463e-16
  19. >>> print(round(x,1) - 1.0)
  20. 0.0
复制代码

>>> print(x)
1.0
>>> print(x-1.0)
-1.11022302463e-16
>>> print(round(x,1)-1.0)
0.0
已有 1 人评分论坛币 收起 理由
igs816 + 5 精彩帖子

总评分: 论坛币 + 5   查看全部评分

板凳
htnycbq 发表于 2015-12-16 16:15:39
打印0-0.9,然后退出

报纸
floydgyf 在职认证  发表于 2015-12-16 19:12:21
python没有强制数据类型

地板
igs816 在职认证  发表于 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()看一下。

7
909664934 发表于 2016-1-6 06:50:04 来自手机
精度控制用abs(x-1)< 精度值。例 精度值=0.01

java里int i =0; i+=0.1还是0

8
igs816 在职认证  发表于 2016-1-6 09:09:09
909664934 发表于 2016-1-6 06:50
精度控制用abs(x-1)< 精度值。例 精度值=0.01

java里int i =0; i+=0.1还是0
讨论的不是一个东西啊。java是强类型的。

9
909664934 发表于 2016-1-7 11:06:12
igs816 发表于 2016-1-6 09:09
讨论的不是一个东西啊。java是强类型的。
python是弱类型的所以有一次自动转型
所以float有精度问题
精度问题一般都是通过 abs(a-b)<c 改变c的值来控制精度的

3个考点
x+=0.1和x=x+0.1的区别
强弱类型语言里的不同区别
精度如何控制

10
igs816 在职认证  发表于 2016-1-8 00:07:52
909664934 发表于 2016-1-7 11:06
python是弱类型的所以有一次自动转型
所以float有精度问题
精度问题一般都是通过 abs(a-b)
python是动态语言。你所说的有一次自动转型,请问自动转型之前是什么类型?
精度只和机器有关,超过机器精度的大数需要特殊手段实现。
还有3个考点,语言是用来用的不是用来考试的。
学习python的可能只会这一种语言,何来的强弱类型语言的不同区别?
+=这种表达式也不是所有语言都支持。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-26 09:25