nessaj 发表于 2022-5-5 14:17

alann 发表于 2022-5-5 15:40

做了个实验
a=0.6
b=6/10
c=0.3+0.3
d=6*0.1
结果d>a=b=c
这么看乘法最特殊也最不精确

takooctopus 发表于 2022-5-5 16:41

虽然乘法精确性不那么高,但是它算的快啊,要不然图形库里也不至于总是直接乘倒数了。

银白色暴风雪 发表于 2022-5-5 16:57

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

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

Tring 发表于 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质因数的最简分数,在二进制下都无法用有限位精确表示,
所以二进制浮点型其实是个巨坑爹的玩意。

EraserKing 发表于 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:就算是整数,以浮点数存储的时候也有精度问题:先给你打个预防针
>>> 12345678901234567.0 == 12345678901234568.0
True

>>> 1234567890123456.0 == 1234567890123457.0
False

すぴぱら 发表于 2022-5-5 18:59

ohi 发表于 2022-5-5 21:22

页: 1 [2]
查看完整版本: 学python第四天遇到一个奇怪的问题