R 中的双曲正切在 Windows 中抛出 NAN 但在 Mac 中不抛出 NAN?
Hyperbolic Tangent in R throws NAN in Windows but not in Mac?
当使用 R 基函数 tanh
估计 Windows 中的双曲正切值时,函数 returns 'NaN' 为大值(实数,虚部为 0):
tanh(356 + 0i)
> NaN + 0i
但是在Mac中同样取值returns1(恰好"real"的数学值应该接近1):
tanh(356 + 0i)
> 1 + 0i
Question 1: Does anybody have a clue on why is this happening?
额外信息
这似乎不是浮点数问题,因为似乎 Mac 的 tanh
returns 1 对于任意大的值:
tanh(999999677873648767519238192348124812341234182374817239847812738481234871823+0i)
> 1 + 0i
问题似乎与虚部有关:
tanh(356)
> 1
在 Windows 和 Mac 中。这个问题似乎是系统(或处理器?)特定的,因为我们已经尝试过:
- Mac El Capitan v 10.11.6 处理器:2.7 GHz Intel Core i5
- Mac 使用 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 家庭高级服务包 1 处理器:英特尔酷睿 i5-2410M CPU @2.30 GHz 2.30GHz。
这些 Windows 机器抛出 NaN
,Mac 的 1 + 0i
。
在所有情况下,我们都使用 R 版本 3.3.3 "newest"(64 位)。
@Ben Bolker 就在现场。 Windows 使用了一些旧的 C 库,这里是 glibc 的 "mathlib" 部分。
更具体地说,根据 Windows https://cran.r-project.org/bin/windows/base/rdevel.html 的 R-devel 的 CRAN 下载页面,
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 版本中-开发,tanh(500+0i)
仍然 returns 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.
上则不然
当使用 R 基函数 tanh
估计 Windows 中的双曲正切值时,函数 returns 'NaN' 为大值(实数,虚部为 0):
tanh(356 + 0i)
> NaN + 0i
但是在Mac中同样取值returns1(恰好"real"的数学值应该接近1):
tanh(356 + 0i)
> 1 + 0i
Question 1: Does anybody have a clue on why is this happening?
额外信息
这似乎不是浮点数问题,因为似乎 Mac 的 tanh
returns 1 对于任意大的值:
tanh(999999677873648767519238192348124812341234182374817239847812738481234871823+0i)
> 1 + 0i
问题似乎与虚部有关:
tanh(356)
> 1
在 Windows 和 Mac 中。这个问题似乎是系统(或处理器?)特定的,因为我们已经尝试过:
- Mac El Capitan v 10.11.6 处理器:2.7 GHz Intel Core i5
- Mac 使用 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 家庭高级服务包 1 处理器:英特尔酷睿 i5-2410M CPU @2.30 GHz 2.30GHz。
这些 Windows 机器抛出 NaN
,Mac 的 1 + 0i
。
在所有情况下,我们都使用 R 版本 3.3.3 "newest"(64 位)。
@Ben Bolker 就在现场。 Windows 使用了一些旧的 C 库,这里是 glibc 的 "mathlib" 部分。
更具体地说,根据 Windows https://cran.r-project.org/bin/windows/base/rdevel.html 的 R-devel 的 CRAN 下载页面, 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 版本中-开发,tanh(500+0i)
仍然 returns 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.