为什么我在Mac和Windows上使用Eigen对这个简单的三维矢量操作看到不同的结果?
我在MacBook Pro(macOS 10.12.6)上写了一些模拟代码,并对其进行了广泛的测试。一旦我的同事尝试在Windows上使用它,他就会遇到问题。他给了我一个特定的失败案例。它对我有用。当我们挖掘时,它归结为尝试归一化3d零向量,因此尝试除以零。当我得到(0,0,0)时,他得到了(nan,nan,nan)。在它发生的环境中,零结果是软/无害的失败,这就是为什么我在测试中没有注意到它。
显然,nans的矢量是正确的答案。我在Vagrant下运行的Ubuntu构建中尝试了它(-nan,-nan,-nan)。
有谁知道为什么我在macOS上得到(0,0,0)?我认为默认情况下Xcode使用的是LLVM。 Ubuntu构建使用了clang。
答案 0 :(得分:2)
我怀疑你在macOS上有一个更新的Eigen版本。 normalize()
的行为已经改变了一段时间:
https://bitbucket.org/eigen/eigen/commits/12f866a746
此处讨论了预期的行为:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=977
答案 1 :(得分:1)
检查编译器标志。您可能已启用快速数学运算(gcc中为-ffast-math
)。这会启用-ffinite-math-only
(再次,gcc),以及quote:
允许优化浮点运算,假设参数和结果不是NaN或+ -Infs。