我正在Python(Numpy)和R中進行數據分析。我的數據是一個向量795067 X 3,並計算此平均值,中值,標準偏差和IQR數據會產生不同的結果,具體取決於我使用的是Numpy還是R.我對這些值進行了交叉檢查,看起來R給出了「正確」的值。浮點數的乘法在Numpy和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來給我「正確的」答案?
這將有助於顯示您的代碼,以便我們可以解決您的實際問題。區分浮動如何被打印*與實際浮點*值*之間的區別也很重要。例如,在R中,'sprintf(「%。20f」,1.222 * 1.222)'打印'「1。49328399999999983372「'與{'.20f}'.format(1.222 * 1.222)'在Python中得到的結果完全相同。浮點值是相同的,但是當你在R提示符下輸入1.222 * 1.222' ,R打印'1.493284',而Python打印'1.4932839999999998' – unutbu
你也可以嘗試將NumPy數據的'dtype'改爲'float128':'data = data.astype(np.float128)',雖然它可能有幫助 – unutbu
@unutbu:R使用64位浮點數,因此在Python中堅持使用64位浮點數是合理的。 –