浮点数的乘法在 Numpy 和 R 中给出不同的结果
Multiplication of floating point numbers gives different results in Numpy and R
我正在 Python (Numpy) 和 R 中进行数据分析。我的数据是一个向量 795067 X 3 并且计算该数据的均值、中值、标准差和 IQR 会产生不同的结果,具体取决于无论我使用 Numpy 还是 R。我交叉检查了值,看起来 R 给出了 "correct" 值。
Median:
Numpy:14.948499999999999
R: 14.9632
Mean:
Numpy: 13.097945407088607
R: 13.10936
Standard Deviation:
Numpy: 7.3927612774052083
R: 7.390328
IQR:
Numpy:12.358700000000002
R: 12.3468
数据的最大值和最小值在两个平台上是相同的。我 运行 进行快速测试以更好地了解这里发生的事情。
- 在 Numpy 中乘以 1.2*1.2 得到 1.4(与 R 相同)。
- 乘以 1.22*1.22 在 Numpy 中得到 1.4884,在 R 中也是如此。
- 然而,在 Numpy 中乘以 1.222*1.222 得到 1.4932839999999998,这显然是错误的!在 R 中进行乘法给出了 1.49324 的正确答案。
- 在 Numpy 中乘以 1.2222*1.2222 得到 1.4937728399999999 和 R 中的 1.493773。再一次,R 是正确的。
在 Numpy 中,数字是 float64 数据类型,而在 R 中是双精度的。这是怎么回事?为什么 Numpy 和 R 给出不同的结果?我知道 R 使用 IEEE754 双精度,但我不知道 Numpy 使用什么精度。我怎样才能改变 Numpy 给我 "correct" 答案?
Python
Python中的print
statement/function将打印单精度浮点数。计算实际上将按照指定的精度进行。 Python/numpy 默认使用双精度浮点数(至少在我的 64 位机器上):
import numpy
single = numpy.float32(1.222) * numpy.float32(1.222)
double = numpy.float64(1.222) * numpy.float64(1.222)
pyfloat = 1.222 * 1.222
print single, double, pyfloat
# 1.49328 1.493284 1.493284
print "%.16f, %.16f, %.16f"%(single, double, pyfloat)
# 1.4932839870452881, 1.4932839999999998, 1.4932839999999998
在交互式Python/iPythonshell中,shell打印语句结果时打印双精度结果:
>>> 1.222 * 1.222
1.4932839999999998
In [1]: 1.222 * 1.222
Out[1]: 1.4932839999999998
R
看起来 R 在使用 print
和 sprintf
时与 Python 做的一样:
print(1.222 * 1.222)
# 1.493284
sprintf("%.16f", 1.222 * 1.222)
# "1.4932839999999998"
相对于interactive Python shells,interactive R shell在打印语句结果时也打印单精度:
> 1.222 * 1.222
[1] 1.493284
Python 和 R
的区别
结果中的差异可能是由于在 numpy 中使用单精度值造成的。大量additions/subtractions的计算最终会使问题浮出水面:
In [1]: import numpy
In [2]: a = numpy.float32(1.222)
In [3]: a*6
Out[3]: 7.3320000171661377
In [4]: a+a+a+a+a+a
Out[4]: 7.3320003
正如您实际问题的评论中所建议的,确保在您的 numpy 计算中使用双精度浮点数。
我正在 Python (Numpy) 和 R 中进行数据分析。我的数据是一个向量 795067 X 3 并且计算该数据的均值、中值、标准差和 IQR 会产生不同的结果,具体取决于无论我使用 Numpy 还是 R。我交叉检查了值,看起来 R 给出了 "correct" 值。
Median:
Numpy:14.948499999999999
R: 14.9632
Mean:
Numpy: 13.097945407088607
R: 13.10936
Standard Deviation:
Numpy: 7.3927612774052083
R: 7.390328
IQR:
Numpy:12.358700000000002
R: 12.3468
数据的最大值和最小值在两个平台上是相同的。我 运行 进行快速测试以更好地了解这里发生的事情。
- 在 Numpy 中乘以 1.2*1.2 得到 1.4(与 R 相同)。
- 乘以 1.22*1.22 在 Numpy 中得到 1.4884,在 R 中也是如此。
- 然而,在 Numpy 中乘以 1.222*1.222 得到 1.4932839999999998,这显然是错误的!在 R 中进行乘法给出了 1.49324 的正确答案。
- 在 Numpy 中乘以 1.2222*1.2222 得到 1.4937728399999999 和 R 中的 1.493773。再一次,R 是正确的。
在 Numpy 中,数字是 float64 数据类型,而在 R 中是双精度的。这是怎么回事?为什么 Numpy 和 R 给出不同的结果?我知道 R 使用 IEEE754 双精度,但我不知道 Numpy 使用什么精度。我怎样才能改变 Numpy 给我 "correct" 答案?
Python
Python中的print
statement/function将打印单精度浮点数。计算实际上将按照指定的精度进行。 Python/numpy 默认使用双精度浮点数(至少在我的 64 位机器上):
import numpy
single = numpy.float32(1.222) * numpy.float32(1.222)
double = numpy.float64(1.222) * numpy.float64(1.222)
pyfloat = 1.222 * 1.222
print single, double, pyfloat
# 1.49328 1.493284 1.493284
print "%.16f, %.16f, %.16f"%(single, double, pyfloat)
# 1.4932839870452881, 1.4932839999999998, 1.4932839999999998
在交互式Python/iPythonshell中,shell打印语句结果时打印双精度结果:
>>> 1.222 * 1.222
1.4932839999999998
In [1]: 1.222 * 1.222
Out[1]: 1.4932839999999998
R
看起来 R 在使用 print
和 sprintf
时与 Python 做的一样:
print(1.222 * 1.222)
# 1.493284
sprintf("%.16f", 1.222 * 1.222)
# "1.4932839999999998"
相对于interactive Python shells,interactive R shell在打印语句结果时也打印单精度:
> 1.222 * 1.222
[1] 1.493284
Python 和 R
的区别结果中的差异可能是由于在 numpy 中使用单精度值造成的。大量additions/subtractions的计算最终会使问题浮出水面:
In [1]: import numpy
In [2]: a = numpy.float32(1.222)
In [3]: a*6
Out[3]: 7.3320000171661377
In [4]: a+a+a+a+a+a
Out[4]: 7.3320003
正如您实际问题的评论中所建议的,确保在您的 numpy 计算中使用双精度浮点数。