R-gmp包如何处理“Inf”?

3
我在运行R中的gmp时注意到以下内容:
Rgames> log2(Inf)
[1] Inf
Rgames> log2(as.bigz(Inf))
[1] 8000

这里发生了什么?或者是语言(或方法)不支持“Inf”概念?编辑:Josh的评论是正确的:它不是函数本身,而是似乎将转换为<2^8000>作为整数。更改标题以匹配。顺便说一句,还有这个:
Rgames> log2(-Inf)
[1] NaN
Warning message:
NaNs produced 
Rgames> log2(as.bigz(-Inf))
[1] NaN

编辑:那样做很愚蠢。log2(negative_anything)的结果是NaN

但是,

Rgames> log2(-as.bigz(-Inf))
[1] 8000

符合Josh的答案。

官方的GMP库不支持Inf/NaN(但MPFR支持),所以这完全取决于R包装器(我对此一无所知)。 - Marc Glisse
1
看一下 as.bigz(Inf) 的打印值,就会发现这与 log2 没有任何关系,而 log2 的行为似乎相当合理... - Josh O'Brien
嗨,卡尔——现在你知道R包gmp如何处理as.bigz(Inf)了,那么问题是什么?你是在问为什么做出了这个设计决策吗?它是否是底层GMP库的属性?这是否有记录?还是其他什么?(我确实同意这种行为很奇怪和出乎意料...) - Josh O'Brien
1
如果您下载gmp的源代码,并在$gmp-HOME$/src/bigintegerR.cc中搜索“Inf”,您会发现以下几行:/// New: numeric '+- Inf' give +- "Large" instead of NA,稍后是else { // dj is +- Inf : use LARGE ( = +- 2 ^ 80000 -- arbitrarily )。我猜测由于GMP库没有“Inf”的概念/表示,因此R软件包的作者必须对如何将用户提供的“Inf”值传递给外部库做出一些决策。看起来他们曾经将“Inf”转换为“NA”,现在则将其转换为2^80000。 - Josh O'Brien
@Josh - 谢谢。我已经开始搜索tarball,但还没有找到。请继续发布它作为答案;我会联系维护者请求将该转换值放入帮助文件中。 - Carl Witthoft
显示剩余2条评论
1个回答

4

应请求为Josh发布的侦探工作做翻译:

如果你下载了gmp的源代码,并在$gmp-HOME$/src/bigintegerR.cc中搜索 "Inf",你会找到以下几行代码:

/// New: numeric '+- Inf' give +- "Large" instead of NA

稍后一点
else { // dj is +- Inf : use LARGE ( = +- 2 ^ 80000 -- arbitrarily )

我的猜测是,由于GMP库没有概念/表示的Inf,因此R软件包的作者必须就如何传递用户提供的Inf值给外部库做出一些决策。看起来他们曾经将Inf转换为NA,现在将其转换为2^80000


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