在R语言中处理非常小的数字

3

这是我第一次在论坛上发帖,请温柔点。我已经使用R编程超过一年了。

我试图对直接来自质谱仪的大型数据集进行(数学上非常简单的)统计分析。您可能知道,这些仪器非常精确,并且可以准确地测量非常大和非常小的电压:50V到0.00000000000000010V。然后将这些值报告到制表符分隔文件中,我可以将其读入R。

然而,在此时,我遇到了以下问题:如果将数据转换为双精度,我会失去重要信息。如果我将它们保留为字符或因子,我就无法“使用”它们并计算我需要得到的内容。

是否有一种解决方法,可以保持精度并使用R?使用基于C ++的语言(如Matlab)是否更好? Matlab能够做到这一点吗?


2
你有没有一个例子来说明你的问题? - user3710546
测量大电压时,仪器的精度有多高? - Patricia Shanahan
2
小心浮点数的精度。请参阅R地狱第10页,章节“跌入浮点数陷阱”。(例如:> 0.1 != (0.2/2)[1] TRUE,而 > print(0.01,digits=22)[1] 0.01000000000000000020817)。我认为这是C编译器的问题,您在其他编程语言中可能会遇到相同的问题。 - jomuller
2
@jomuller C编译器没有问题。你不能用有限大小的数据类型表示所有数字。 - David Heffernan
@DavidHeffernan 谢谢您的解释!我只有一点编译语言的经验。 - jomuller
@user2441481 如果你想在这里得到帮助,你真的需要回应这个线程中的第一条评论。在你这样做之前,由于实际问题没有明确说明,你不太可能得到真正的帮助。 - David Heffernan
1个回答

4
您可以使用图书馆 gmp http://cran.r-project.org/web/packages/gmp/ 示例(大数字)
install.packages("gmp")
library(gmp)
largevalue <- as.bigz(2305843009213694080000000)
largevalue 

示例(小数)

smallvalues <- asNumeric(cbind(0.0000000000000000000001,0.0000000000000000000003))
smallvalues

我真的不明白这有什么帮助。在抛出库之前,先诊断问题会更好。 - David Heffernan
1
@ David Heffernan 这个例子已经针对问题中突出的“小数”算术问题进行了编辑。您可以按照示例强制转换为数字进行算术运算。 - Pork Chop
1
双精度浮点值可以很好地处理小数。将0.00000000000000010存储在双精度浮点数中有什么大不了的呢?数据类型的分辨率远远超过原始数据的分辨率。再次强调,在使用库之前,最好先诊断问题的真正本质。 - David Heffernan
2
已经有一个很好的线程详细讨论了R中的浮点算术,所以我之前就用'gmp'包找到了解决方案,所以我很快想到了它。更多详情请参见:https://dev59.com/_Gkw5IYBdhLWcg3w_fiJhttps://dev59.com/wlnUa4cB1Zd3GeqPdb1m - Pork Chop
1
我对这个问题的理解是“如何在使用R进行计算时保持精度到最后一点”,我认为我通过我的示例回答了这个问题 :)。 - Pork Chop
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接