簡體   English   中英

浮點數的乘法在Numpy和R中給出不同的結果

[英]Multiplication of floating point numbers gives different results in Numpy and R

我正在使用Python(Numpy)和R進行數據分析。我的數據是向量795067 X 3並計算此數據的均值,中位數,標准差和IQR會產生不同的結果,具體取決於我是使用Numpy還是R.我交叉檢查值和它看起來像R給出“正確”的值。

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和1.493773在R.再一次,R是正確的。

在Numpy中,數字是float64數據類型,它們在R中是雙倍的。這里發生了什么? 為什么Numpy和R會給出不同的結果? 我知道R使用IEEE754雙精度,但我不知道Numpy使用的精度。 我怎樣才能改變Numpy給我“正確”的答案?

蟒蛇

Python中的print語句/函數將打印單精度浮點數。 計算實際上將以指定的精度完成。 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 / iPython shell中,shell在打印語句結果時打印雙精度結果:

>>> 1.222 * 1.222
1.4932839999999998

In [1]: 1.222 * 1.222
Out[1]: 1.4932839999999998

[R

在使用printsprintf時,看起來R和Python一樣:

print(1.222 * 1.222)
# 1.493284

sprintf("%.16f", 1.222 * 1.222)
# "1.4932839999999998"

與交互式Python shell相比,交互式R shell在打印語句結果時也會打印單精度:

> 1.222 * 1.222
[1] 1.493284

Python和R之間的差異

在numpy中使用單精度值可能會導致結果的差異。 具有大量加法/減法的計算最終會使問題浮出水面:

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計算中使用雙精度浮點數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM