Python和非常小的小数

  发布于 2023-01-29 16:32

关于在macosx上运行的Python 2.7.6的有趣事实:

你有一个非常小的数字,如:

0.000000000000000000001

您可以将其表示为:

>>> 0.1 / (10 ** 20)
1.0000000000000001e-21

但是你可以在最后看到浮动指向错误.我们真正拥有的是这样的:

0.0000000000000000000010000000000000001

所以我们得到了一个错误的数字,但没关系.问题如下:

正如所料:

>>> 0.1 / (10 ** 20) == 0
False

但是,等等,这是什么?

>>> 0.1 / (10 ** 20) + 1 == 1
True

>>> repr(0.1 / (10 ** 20) + 1)
'1.0'

看起来python正在使用另一种数据类型来表示我的数字,因为这只在使用第16个十进制数字时发生,依此类推.另外为什么python决定自动将我的号码转换0为添加?我不应该使用十进制小部分和浮点错误处理十进制数吗?

我知道这个问题可能落在浮点错误的保护伞中,并且解决方案通常是不信任这种计算的浮点数,但我想了解更多关于发生在幕后的事情.

2 个回答
  • 考虑当您尝试添加7.00和.001时会发生什么,并且只允许使用三位数作为答案.7.001是不允许的.你是做什么?

    在您可以返回的值中,例如6.99,7.00和7.01,最接近正确答案的是7.00.因此,当要求添加7.00和.001时,返回7.00.

    当你要求它在1e-21和1附近添加一个数字时,计算机有同样的问题.它只有53位用于浮点值的小数部分,而1e-21几乎比1位低70位.因此,它将正确的结果舍入到它可以的最接近的值1,并返回该结果.

    2023-01-29 16:35 回答
  • 浮点数就像科学记数法一样.1.0000000000000001e-21适合64位浮点数允许的53位有效数字/尾数.除此之外1,比微小部分大许多个数量级,会导致细微的细节被丢弃,1而是准确地存储

    2023-01-29 16:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有