gslshell(基于Lua的)返回0/0 == 0/0为true。

在 gsl-shell(基于 luajit 的 gsl 接口)中,我得到了以下输出:

> 0/0==0/0
true 

然而在 Lua 5.1 中,输出结果为 false。 为什么会出现这种情况呢?这种差异是来自于 Luajit 和 Lua、GSL 库还是 gsl-shell 接口呢?

点赞
用户258523
用户258523

快速测试表明这是 gsl-shell 的问题。debianlua5.1lua5.2CentOS 5 上自行编译的 lua 5.1 和从 git 主分支自行编译的 luajit 均显示正常行为(并在直接打印 0/0 的结果时返回nan)。当前版本的 gsl-shell(针对 Windows)存在您所指示的问题,并在打印 0/0 的结果时返回 -2147483648

我无法解释(甚至不能真正推测),但这显然似乎是 gsl-shell 的问题。

2014-01-08 17:47:52
用户305669
用户305669

在 gsl-shell 邮件列表上问了一个问题,发现这是因为 gsl-shell 编译时使用了 -ffast-math 标志,这个标志(出人意料地!)禁用了 nans 和 infs。1

根据GCC手册,我猜这个选项不应该在像GSL-Shell这样的数值应用程序中开启。

-ffast-math
设置-fno-math-errno,-funsafe-math-optimizations,
 -fno-trapping-math,-ffinite-math-only,-fno-rounding-math,-fno-signaling-nans和fcx-limited-range。
此选项会导致预处理器宏FAST_MATH被定义。
对于依赖于IEEE或ISO规则/数学函数规范的精确实现的程序,任何-O选项都不应该打开此选项, 因为它可能导致输出错误。
2014-01-09 15:02:24