python - 恢复标准化操作时的精度问题

标签 python numpy floating-point precision

我正在进行一些标准化操作,令我惊讶的是,当尝试恢复该操作时,assert_array_almost_equal 的默认 6 位十进制精度出现 100% 的不匹配。为什么会出现这种情况?难道是因为我的最大值的精度问题?如果是这样,如何在 numpy.ndarray.max() 中获得更高的精度?

from __future__ import division
import numpy

_max = numpy.float128(67.1036) # output of numpy.ndarray.max() on an a float32 array

def divide_and_mult(x, y):
    return numpy.divide(numpy.float128(x), y) * y

for i in range(100):
    try: numpy.testing.assert_array_equal(divide_and_mult(i, _max), numpy.float128(i))
    except AssertionError, e: print e

最佳答案

使用 numpy 数组无法获得比 float128 更高的精度,在大多数系统上,最好的精度甚至更低:float64

通常你不关心精度的一点损失并使用 np.testing.assert_almost_equal或类似的函数,可让您测试特定的绝对和/或相对差异。

如果您想以更高的精度执行此操作,则需要使用具有无限或至少用户定义精度的类型:decimal.Decimalfractions.Fraction或者切换到符号数学库,例如 sympy .

关于python - 恢复标准化操作时的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859035/

相关文章:

python - 使用正则表达式匹配单词 (Python 3)

python - 从 NumPy 数组中选择特定的行和列

python - 以与使用元组相同的方式使用 ndarray 进行索引

javascript - 在 JavaScript 中获取 float 的长度

java - 性能: float 转换为整数并将结果裁剪到范围

python - 对 Python 3 中的多个项目使用相同的字符串格式

Python:在目录中引用文件上一级的最佳方式?

python - 为什么 PySpark 找不到 py4j.java_gateway?

python - 如何在 python 中计算昂贵的高精度总和?

用于舍入 float 的 Python 超参数