我正在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位浮点数是合理的。 –