【发布时间】:2015-04-28 13:01:22
【问题描述】:
在几乎所有系统上,Python 都可以为您提供人类可读的简短浮点表示,而不是 17 位机器精度:
Python 3.3.0 (default, Dec 20 2014, 13:28:01)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.1
>>> import sys; sys.float_repr_style
'short'
在ARM926EJ-S 上,您不会得到简短的表示:
Python 3.3.0 (default, Jun 3 2014, 12:11:19)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>> import sys; sys.float_repr_style
'legacy'
Python 2.7 显然在 repr() 中添加了这个简短的表示,对于大多数系统:
浮点数和字符串之间的转换现在可以在大多数平台上正确四舍五入。这些转换发生在许多不同的地方:浮点数和复数上的 str(); float 和 complex 构造函数;数字格式;使用 marshal、pickle 和 json 模块序列化和反序列化浮点数和复数;解析 Python 代码中的浮点数和虚数文字;和小数到浮点数的转换。
与此相关,浮点数 x 的 repr() 现在返回基于最短十进制字符串的结果,该字符串保证在正确舍入下返回到 x(使用半舍入到偶数舍入模式) .以前它给出了一个基于将 x 舍入为 17 位十进制数字的字符串。
负责此改进的舍入库可在 Windows 和 Unix 平台上使用 gcc、icc 或 suncc 编译器运行。 可能有少数平台无法保证此代码的正确运行,因此该代码未在此类系统上使用。您可以通过检查 sys.float_repr_style 来找出正在使用的代码,如果新代码正在使用,它将很短,如果没有,则为旧代码。
由 Eric Smith 和 Mark Dickinson 使用 David Gay 的
dtoa.c库实现; issue 7117.
他们说某些平台不能保证正确操作(我假设是dtoa.c),但不要说是哪个平台限制导致了这种情况。
ARM926EJ-S 是怎么回事,不能使用短浮点 repr()?
【问题讨论】:
-
问题:您使用的是旧的 ABI (OABI) 吗?
float.__getformat__('double')在该平台上返回什么? -
哦,还有一个测试:
1e16 + 2.9999在您的平台上给出了什么结果? (对我来说,它给出了1.0000000000000002e+16。) -
1.获取双倍格式:
'IEEE, little-endian'。 2. 1e16:1.0000000000000002e+16 -
谢谢。这两者都没有明显的问题。你自己构建 Python 吗?如果是这样,您可以查看由
configure脚本生成的pyconfig.h文件以了解发生了什么。如果没有,这似乎是一个问题,您应该与构建该版本 Python 的人讨论。 -
它来自 buildroot。
标签: python floating-point