找回密码
 立即注册
搜索
楼主: 诶哟卧草

[软件] 学python第四天遇到一个奇怪的问题

[复制链接]
头像被屏蔽
     
发表于 2022-5-5 14:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2022-5-5 15:40 | 显示全部楼层
做了个实验
a=0.6
b=6/10
c=0.3+0.3
d=6*0.1
结果d>a=b=c
这么看乘法最特殊也最不精确
回复

使用道具 举报

     
发表于 2022-5-5 16:41 | 显示全部楼层
虽然乘法精确性不那么高,但是它算的快啊,要不然图形库里也不至于总是直接乘倒数了。
回复

使用道具 举报

     
发表于 2022-5-5 16:57 | 显示全部楼层
kara2000 发表于 2022-5-5 09:42
接着用就是了,你又不造火箭在乎这点误差?或者你学python是为了输出数值龟龟整整的好看? ...

造火箭也不会在乎这点误差,不少老代码还是用的单精度浮点数呢
回复

使用道具 举报

     
发表于 2022-5-5 17:30 | 显示全部楼层
本帖最后由 Tring 于 2022-5-5 17:35 编辑
诶哟卧草 发表于 2022-5-5 12:45
其实我觉得4.9999999 还是5还是5.0000001也无所谓了,目前我还没有计算机思维感觉这几个数都一样。
但我最 ...

因为有问题的是0.1 。
1/10也就是十进制的0.1,在二进制下是一个无限循环小数(因为含有因数5),并不能用有限位表示。

这么说或许不太直观,换成十进制的例子,你可以理解为1/3:
1/3在十进制里有限位表示为0.33333
1.8 * 0.33333 = 0.599994
1.8 / 3 = 0.6

乘以0.1在二进制里也是一样的情况。
事实上任何一个在分母中含有非2质因数的最简分数,在二进制下都无法用有限位精确表示,
所以二进制浮点型其实是个巨坑爹的玩意。
回复

使用道具 举报

     
发表于 2022-5-5 18:41 | 显示全部楼层
本帖最后由 EraserKing 于 2022-5-5 18:44 编辑

2022年了还有人在踩这个坑 IEEE 754标准罪大恶极啊

基本原理楼上有人都说过了,不要钻这个牛角尖,不能表示为“非2的整数次幂分之一的小数之和”的小数是没有办法精确地以二进制浮点数储存的
你随便一搜“Python 小数 精度”不就有官方解答了吗?
https://docs.python.org/zh-cn/3/tutorial/floatingpoint.html

你看到的0.7也不是精确的0.7,只是保留17位精度之下“显示为0.7”而已

BTW:就算是整数,以浮点数存储的时候也有精度问题:先给你打个预防针
  1. >>> 12345678901234567.0 == 12345678901234568.0
  2. True

  3. >>> 1234567890123456.0 == 1234567890123457.0
  4. False
复制代码

评分

参与人数 1战斗力 +1 收起 理由
诶哟卧草 + 1 龟龟

查看全部评分

回复

使用道具 举报

头像被屏蔽
     
发表于 2022-5-5 18:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
发表于 2022-5-5 21:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-22 21:26 , Processed in 0.043440 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表