gpt4 book ai didi

python - 是什么导致 Python 的 float_repr_style 使用 legacy?

转载 作者:太空狗 更新时间:2023-10-30 01:14:32 34 4
gpt4 key购买 nike

在几乎每个系统上,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(),对于大多数系统:

Conversions between floating-point numbers and strings are now correctly rounded on most platforms. These conversions occur in many different places: str() on floats and complex numbers; the float and complexconstructors; numeric formatting; serializing and deserializing floats and complex numbers using the marshal, pickle and json modules; parsing of float and imaginary literals in Python code; and Decimal-to-float conversion.

Related to this, the repr() of a floating-point number x now returns a result based on the shortest decimal string that’s guaranteed to round back to x under correct rounding (with round-half-to-even rounding mode). Previously it gave a string based on rounding x to 17 decimal digits.

The rounding library responsible for this improvement works on Windows and on Unix platforms using the gcc, icc, or suncc compilers. There may be a small number of platforms where correct operation of this code cannot be guaranteed, so the code is not used on such systems. You can find out which code is being used by checking sys.float_repr_style, which will be short if the new code is in use and legacy if it isn’t.

Implemented by Eric Smith and Mark Dickinson, using David Gay’s dtoa.c library; issue 7117.

他们说某些平台不能保证正确操作(我假设是 dtoa.c),但没有说明是哪个平台限制导致了这种情况。

ARM926EJ-S 有什么意思不能使用 short float repr()?

最佳答案

简短回答:这可能不是平台的限制,而是 Python 构建机制的限制:它没有为浮点计算设置 53 位精度的通用方法。

有关更多详细信息,请查看 Include/pyport.h Python 源代码分发中的文件。以下是摘录:

/* If we can't guarantee 53-bit precision, don't use the code
in Python/dtoa.c, but fall back to standard code. This
means that repr of a float will be long (17 sig digits).

Realistically, there are two things that could go wrong:

(1) doubles aren't IEEE 754 doubles, or
(2) we're on x86 with the rounding precision set to 64-bits
(extended precision), and we don't know how to change
the rounding precision.
*/

#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \
!defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \
!defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
#define PY_NO_SHORT_FLOAT_REPR
#endif

/* double rounding is symptomatic of use of extended precision on x86. If
we're seeing double rounding, and we don't have any mechanism available for
changing the FPU rounding precision, then don't use Python/dtoa.c. */
#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION)
#define PY_NO_SHORT_FLOAT_REPR
#endif

基本上,有两件事可能会出错。一是 Python 配置无法识别 C double 的浮点格式。该格式几乎总是 IEEE 754 binary64,但有时配置脚本无法识别。这是上面代码段中的第一个 #if 预处理器检查。查看编译时生成的 pyconfig.h 文件,看看是否至少有一个 DOUBLE_IS_... 宏是 #defined .或者,在 Python 提示符下试试这个:

>>> float.__getformat__('double')
'IEEE, little-endian'

如果你看到类似上面的内容,这部分应该没问题。如果您看到类似 'unknown' 的内容,则说明 Python 尚未成功识别浮点格式。

第二个可能出错的地方是我们确实有 IEEE 754 binary64 格式的 double ,但 Python 的构建机制无法弄清楚如何确保该平台的浮点计算的 53 位精度。 dtoa.c 源代码要求我们能够以 53 位的精度执行所有浮点运算(无论是在硬件还是软件中实现)。对于使用 x87 浮点单元进行 double 计算(与较新的 SSE2 指令相反)的英特尔处理器来说,这尤其是一个问题:x87 的默认精度是 64 位,并将其用于 double 计算使用该默认精度设置导致 double rounding ,这打破了 dtoa.c 假设。因此在配置时,构建机器运行检查以查看 (1) 双舍入是否是一个潜在问题,以及 (2) 如果是,是否有办法将 FPU 设置为 53 位精度。因此,现在您要查看 X87_DOUBLE_ROUNDINGHAVE_PY_SET_53BIT_PRECISION 宏的 pyconfig.h

所以它可能是以上任何一种。如果非要我猜的话,我会猜想在那个平台上,双舍入被检测为一个问题,而且不知道如何修复它。这种情况下的解决方案是调整 pyport.h 以定义 _Py_SET_53BIT_PRECISION_* 宏,以任何平台特定的方式工作以获得 53 位精度模式,然后定义 HAVE_PY_SET_53BIT_PRECISION

关于python - 是什么导致 Python 的 float_repr_style 使用 legacy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920294/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com