python中float的底层数据结构

2023-12-23

有一个关于 Python 中浮点(和精度)的底层数据结构的问题:

>>> b = 1.4 + 2.3
>>> b
3.6999999999999997

>>> c = 3.7
>>> c
3.7000000000000002

>>> print b, c
3.7  3.7

>>> b == c
False

看来 b 和 c 的值与机器相关,它们是最接近目标值的数字,但不完全相同。有人监督我用“Print”得到了“正确”的数字,有人告诉我这是因为 print 是“谎言”,而 Python 选择告诉我们真相,即准确地显示他们存储的内容。

我的问题是:

1、如何说谎?例如在一个函数中,我们取两个值,如果它们相同则返回,如果小数位数(精度)未知,我如何才能最好地猜测?就像上面提到的 b 和 c 吗?有没有明确的算法来做到这一点?有人告诉我,如果涉及浮点计算,每种语言(C/C++)都会遇到此类问题,但他们如何“解决”这个问题?

2. 为什么我们不能只存储实际数字而不是存储最接近的数字?这是一种限制还是为了效率而进行的交易?

非常感谢 约翰


要回答第一个问题,请查看 Python 源代码中的以下(稍微精简的)代码:

#define PREC_REPR       17
#define PREC_STR        12

void PyFloat_AsString(char *buf, PyFloatObject *v) {
    format_float(buf, 100, v, PREC_STR);
}

void PyFloat_AsReprString(char *buf, PyFloatObject *v) {
    format_float(buf, 100, v, PREC_REPR);
}

所以基本上,repr(float)将返回一个以 17 位精度格式化的字符串,并且str(float)将返回一个具有 12 位精度的字符串。正如您可能已经猜到的那样,print uses str()并在解释器中输入变量名称使用repr()。由于只有 12 位精度,看起来您得到了“正确”答案,但这只是因为您期望的值和实际值在 12 位以内是相同的。

这是差异的一个简单示例:

>>> str(.1234567890123)
'0.123456789012'
>>> repr(.1234567890123)
'0.12345678901230001'

至于你的第二个问题,我建议你阅读Python教程的以下部分:浮点运算:问题和限制 http://docs.python.org/tutorial/floatingpoint.html#floating-point-arithmetic-issues-and-limitations

当您以基数 2 存储基数 10 小数时,与任何其他表示形式相比,它归结为效率、更少的内存和更快的浮点运算,但您确实需要处理不精确性。

正如 JBernardo 在评论中指出的那样,这种行为在 Python 2.7 及更高版本中是不同的,上面教程链接中的以下引用描述了差异(使用0.1举个例子):

在 Python 2.7 和 Python 3.1 之前的版本中,Python 对此进行了舍入 值保留 17 位有效数字,即“0.10000000000000001”。在 当前版本,Python 显示基于最短值的值 正确舍入为真实二进制值的小数部分, 结果只是“0.1”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中float的底层数据结构 的相关文章

随机推荐

  • 如何在 Url.Action 中发送多个参数?

    如何在一个文件中发送多个参数Url Action 我有一个带有操作的控制器 我想要 2 个参数 但没有收到第二个参数 我的代码是 Url Action Products Jquery new categoryid 1 Productid 2
  • 使用 ColdFusion 进行简单的 TCP/IP 套接字通信

    我做了一些搜索 似乎没有太多成功的方法可以通过 Coldfusion 成功建立 tcp ip 套接字连接 我试图充当一个简单的客户端并发送一个字符串并获得响应 Adobe 的 EventGateway 需要服务器端设置 我无法触及 但它似乎
  • NSInvalidArgumentException 原因接收器没有带有标识符的 segue

    我一直有一个问题 我有一个 UIViewControllerList和一个 UIViewControllerLogin On Login我有一个按钮 完成 还有同一个 UIViewController 上的另一个隐藏按钮 它有一个 segu
  • Perl 两个日期相减

    我对 Perl 还很陌生 我正在尝试减去这种格式的两个日期 15 07 16 23 13 34 15 07 16 20 04 24 我知道我必须将此字符串转换为日期对象 我的问题是我只能使用基本的 perl 而无需安装额外的软件包 有办法做
  • 仅当对象没有功能和模式验证时才进行淘汰验证

    我想要当标题为空时需要最大价格 我有代码 self searchParameters title ko observable extend refreshCountOffers 500 priceMax ko observable exte
  • Django 注册 - 一些激活

    如何强制向用户发送激活电子邮件 当他不小心删除了邮件时 他点击了我网站上的链接 django 会向他发送新的激活电子邮件 有一个管理操作 http docs djangoproject com en dev ref contrib admi
  • ViewBag 对象属性的 getter 和 setter

    在哪里可以为对象 ViewBag 的属性注册 getter 和 setter ViewBag 是一个动态对象 http msdn microsoft com en us library system dynamic dynamicobjec
  • 如何使用 graph api 设置 Facebook 个人资料图片

    有没有办法使用graph api更改用户的个人资料图片 我知道你不能使用其余的 api 参考 https stackoverflow com questions 2995397 set or update profile picture u
  • Java中如何将一个int转换为三个字节?

    我正在尝试转换int分成三份bytes代表那个int 大端 我确信它与按位和移位有关 但我不知道该怎么做 例如 int myInt some code byte b1 b2 b3 b1 is most significant then b2
  • 证明某种语言正则

    在我的计算理论课上 我们的作业是证明一种语言是正规的 该语言定义为 B 1ky y is in 0 1 and y contains at least k 1s for k gt 1 在我看来 这种语言需要一个下推自动机来为此创建一台机器
  • 用于检查更新、安装新版本应用程序的代码

    我有一个 NET 4 WPF 应用程序 它使用 MSI 进行安装 该 MSI 通过 Visual Studio 安装项目生成 一切都很好 除了我缺少 单击一次部署 功能 该功能在加载时检查应用程序的新版本并下载 安装它们 我放弃了 单击一次
  • 引起原因:java.lang.ClassNotFoundException:org.jets3t.service.ServiceException

    我的代码应该访问存储在 S3 上的一些文件 此代码在一台机器上运行良好 而在另一台机器上失败 基本上 当它从 Intellij IDEA 本地 而不是在集群上 执行时 它会失败 sc hadoopConfiguration set fs s
  • Android Emitter.Listener 不工作

    我正在制作一个带有套接字 IO 的应用程序 它正确连接到服务器 但它不侦听事件 这是我的代码的一部分 private Socket mSocket try mSocket IO socket ip 8000 catch URISyntaxE
  • 如何在 php 中添加 blob 图像 FIrebird?

    无法将照片添加到 FIrebird 写这样的代码 imgSrc Desert jpg img src imgSrc imgbinary fread fopen img src r filesize img src img str base6
  • 无法在Azure函数中使用JpegBitmapEncoder

    在测试 Azure Functions 时 我编写了以下 blob 触发的代码 r System Drawing r PresentationCore r WindowsBase using System Drawing Imaging u
  • awk:仅在某些字段中查找和替换[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个像这样的文本文件 cat test 12 13 2100 s 12 13 3100 s 100 13 100 s 12 13 30
  • 在图片框上添加标签

    我想在我的图片框上写一些文字 所以我认为最简单和最好的办法就是在它上面画标签 这就是我所做的 PB new PictureBox PB Image Properties Resources Image PB BackColor Color
  • OpenAI GPT-2 模型与 TensorFlow JS 结合使用

    是否可以使用 TensorFlowJS 从 OpenAI GPT 2 生成文本 如果不是 限制是什么 例如模型格式或 我看不出有任何理由不这样做 除了 gpt 2 中的某些操作可能不受 tensorflowjs 支持 我不知道该怎么做 但这
  • Django登录用户从未实现

    我的 Django 登录遇到问题 下面的 if 语句 如果 user 不是 None 总是解析为 false 因此它转移到 else 上 我不知道为什么 我将不胜感激任何帮助 Thanks VIEWS PY from django shor
  • python中float的底层数据结构

    有一个关于 Python 中浮点 和精度 的底层数据结构的问题 gt gt gt b 1 4 2 3 gt gt gt b 3 6999999999999997 gt gt gt c 3 7 gt gt gt c 3 70000000000