程永康 发表于 2020-7-30 11:04:45

当一个数位数过多时,python就算不动了?


我瞎编了一个程序:
import random
a = random.randint(1,1e100)
b = random.randint(1,1e100)
int((a+b)/2)
就这样。然后你会发现,很明显,python算错了。这是怎么回事呢?

liuzhengyuan 发表于 2020-7-30 11:05:49

你要 print(int((a+b)/2)) 才能输出

永恒的蓝色梦想 发表于 2020-7-30 11:06:35

明显?

程永康 发表于 2020-7-30 11:08:54

好像还是不对啊,我刚才试了一下,结果和a是一样的

程永康 发表于 2020-7-30 11:10:16

永恒的蓝色梦想 发表于 2020-7-30 11:06
明显?

就比如说,a的在最后一位是7,b的最后一位也是7,但结果的最后一位是8

永恒的蓝色梦想 发表于 2020-7-30 11:14:27

程永康 发表于 2020-7-30 11:10
就比如说,a的在最后一位是7,b的最后一位也是7,但结果的最后一位是8

因为浮点数是有误差的,把int((a+b)/2)改成a + b >> 1就可以了。

程永康 发表于 2020-7-30 11:17:26

永恒的蓝色梦想 发表于 2020-7-30 11:14
因为浮点数是有误差的,把改成就可以了。

哇哦!真的好了,谢谢。请问这是什么高妙的手法?

永恒的蓝色梦想 发表于 2020-7-30 11:18:44

程永康 发表于 2020-7-30 11:17
哇哦!真的好了,谢谢。请问这是什么高妙的手法?

其实就是(a + b) // 2啦,因为是整数除法,不会出现浮点数误差。

程永康 发表于 2020-7-30 11:20:58

永恒的蓝色梦想 发表于 2020-7-30 11:18
其实就是啦,因为是整数除法,不会出现浮点数误差。

明白了,谢谢!

革命年 发表于 2020-7-30 13:51:30

加上了e就代表这是个浮点数,浮点数采用IEEE754标准,这个标准对特别大的数有误差,具体可以参考C/C++交流版块里的子板块里的扩展阅读里浮点数的文章
页: [1]
查看完整版本: 当一个数位数过多时,python就算不动了?