R中的Hyperbolic Tangent在Windows中抛出NAN但在Mac中没有抛出?

时间:2017-03-17 01:01:44

标签: r windows macos hyperbolic-function

当使用R基函数tanh(356 + 0i) > NaN + 0i 估算Windows中的双曲正切(对于大的(实部,有0个虚部)值时,该函数返回' NaN':

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

然而,在Mac中,相同的值返回1(与"实数"数学值一致应该接近1):

tanh
  

问题1:有没有人知道为什么会发生这种情况?

额外信息

这似乎不是一个浮点问题,因为Mac tanh(999999677873648767519238192348124812341234182374817239847812738481234871823+0i) > 1 + 0i 似乎为任意大的值返回1:

tanh(356)
> 1

问题似乎与想象部分有关:

NaN
在Windows和Mac中都是

。问题似乎是系统(或处理器?) - 具体,因为我们已经尝试过:

  • Mac with El Capitan v 10.11.6 处理器:2.7 GHz Intel Core i5
  • Mac with Sierra v 10.12.3 处理器: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计算机抛出1 + 0i,即Mac .then()。 在所有情况下,我们使用R版本3.3.3"最新" (64位)。

1 个答案:

答案 0 :(得分:4)

@Ben Bolker是对的。 Windows使用了一些旧的C库,这里是" mathlib" glibc的一部分。

更具体地说,根据R-devel for Windows https://cran.r-project.org/bin/windows/base/rdevel.html的CRAN下载页面, R 3.3.z系列使用gcc 4。6。3(2012年3月)工具链,而#34; 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' 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

应该{​​{1}} ---但不在Windows上。