当使用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中。 这个问题似乎是系统(或处理器?) – 具体,因为我们已经在尝试:
这些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上。