9

我是一个广泛使用 MATLAB 的 Python 新手。我正在转换一些log2在 MATLAB 中使用的代码,我使用了 NumPylog2函数,得到的结果与我对这么小的数字的预期不同。我很惊讶,因为数字的精度应该是相同的(即 MATLAB double 与 NumPy float64)。

MATLAB 代码

a = log2(64);

--> a=6

基本 Python 代码

import math

a = math.log2(64)

--> a = 6.0

NumPy 代码

import numpy as np

a = np.log2(64)

--> a = 5.9999999999999991

修改后的 NumPy 代码

import numpy as np

a = np.log(64) / np.log(2)

--> a = 6.0

因此,本机 NumPylog2函数给出的结果导致代码无法通过测试,因为它正在检查一个数字是否为 2 的幂。预期结果正好是 6,本机 Pythonlog2函数和修改后的 NumPy 代码都使用对数的性质。log2我对 NumPy函数做错了吗?我现在将代码更改为使用本机 Python log2,但我只是想知道答案。

4

1 回答 1

7

不,代码没有问题,只是因为浮点数不能在我们的计算机上完美表示。在检查浮点值时,始终使用 epsilon 值以允许出现一定范围的错误。阅读浮点指南这篇文章以了解更多信息。

编辑- 正如cgohlke在评论中指出的那样,

根据用于构建 numpy np.log2(x) 的编译器,要么由 C 库计算,要么由 1.442695040888963407359924681001892137*np.log(x) 计算,请参见此链接

这可能是错误输出的原因。

于 2013-07-17T14:10:10.190 回答