R中的双曲正切在Windows中抛出NAN,但不在Mac中?

当使用R基函数tanh估计窗口中的双曲正切时,函数返回“NaN”:对于大的(实数,具有0虚部)值,函数返回:

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

但是,在Mac中,相同的值返回1(与“真实”math值相符应该接近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家庭高级版Service Pack 1 处理器:Intel Core i5-2410M CPU @ 2.30 GHz 2.30GHz。

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

本博克是正确的。 Windows使用一些旧的C库,这里是glibc的“mathlib”部分。

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

因为它应该为tanh(500+0i) —但不在Windows上。