3

在 Windows 中使用 R 基函数tanh为大(实部,虚部为 0)值估计双曲正切时,函数返回“NaN”:

tanh(356 + 0i)
> NaN + 0i

但是,在 Mac 中,相同的值返回 1(与“真实”数学值一致应该接近 1):

tanh(356 + 0i)
> 1 + 0i

问题1:有人知道为什么会这样吗?

额外信息

这似乎不是浮点问题,因为 Mac 似乎tanh为任意大的值返回 1:

tanh(999999677873648767519238192348124812341234182374817239847812738481234871823+0i)
> 1 + 0i

这个问题似乎与虚部有关:

tanh(356)
> 1

在 Windows 和 Mac 中。这个问题似乎是系统(或处理器?)特定的,因为我们已经尝试过:

  • 配备 El Capitan v 10.11.6处理器的 Mac:2.7 GHz Intel Core i5
  • 配备 Sierra v 10.12.3处理器的 Mac:3.2 GHz Intel Core i5
  • Windows 10 Home v 1607处理器:Intel Core m3-SY30 CPU@ 0.90 GHz 1.51 GHz
  • Windows 7 Home Premium Service Pack 1处理器:Intel Core i5-2410M CPU @2.30 GHz 2.30GHz。

这些 Windows 机器抛出NaN,Mac 的1 + 0i. 在所有情况下,我们都使用“最新”(64 位)的 R 版本 3.3.3。

4

1 回答 1

4

@Ben Bolker 就在现场。Windows 使用有点旧的 C 库,这里是 glibc 的“mathlib”部分。

更具体地说,根据 R-devel for Windows 的 CRAN 下载页面https://cran.r-project.org/bin/windows/base/rdevel.html,R 3.3.z 系列使用 gcc 4.6.3 ( 2012 年 3 月)工具链,而“R-devel”,即将推出(尚未发布!)R 3.4.z 系列使用 gcc 4.9.3(2015 年 6 月)工具链。

**然而*我刚刚检查过(在我们的 Windows 服务器虚拟机上安装了 CRAN 的 R-devel 二进制文件),我发现问题仍然存在:在昨天的 R-devel 版本中,tanh(500+0i)仍然返回NaN+0i.

我现在认为更好的解决方案是使用 R 的内部替代品(在 R's 中src/main/complex.c):我们有

#ifndef HAVE_CTANH
#define ctanh R_ctanh
static double complex ctanh(double complex z)
{
    return -I * ctan(z * I); /* A&S 4.5.9 */
}
#endif

我们应该使用它,正如我所看到的那样,确实也在 Windows 上,

R> -1i * tan((500+0i)*1i)

[1] 1+0i

因为它应该用于 tanh(500+0i) --- 但在 Windows 上没有。

于 2017-03-21T09:42:17.133 回答