Mac 与 Windows:Eigen::Vector3f(0,0,0).normalized()
Mac vs Windows: Eigen::Vector3f(0,0,0).normalized()
为什么我在 Mac 和 Windows 上使用 Eigen 这个简单的 3d 矢量运算看到不同的结果?
我在 MacBook Pro (macOS 10.12.6) 上编写了一些模拟代码并对其进行了广泛测试。当我的同事尝试在 Windows 上使用它时,他遇到了问题。他给了我一个具体的失败案例。它对我有用。正如我们挖掘的那样,它归结为对 3d 零向量进行归一化的尝试,因此尝试除以零。他得到了 (nan, nan, nan) 而我得到了 (0, 0, 0)。在它发生的上下文中,零结果是 soft/harmless 失败,这就是为什么我在测试中没有注意到它。
显然 nans 向量是正确的答案。我在 Vagrant 下的 Ubuntu build 运行 中尝试了它并得到了 (-nan, -nan, -nan).
有人知道为什么我在 macOS 上得到 (0, 0, 0) 吗?我认为默认情况下 Xcode 正在使用 LLVM。 Ubuntu 构建使用了 clang。
检查你的编译器标志。您可能启用了快速数学运算(gcc 中的-ffast-math
)。这会启用 -ffinite-math-only
(同样是 gcc),而我 quote:
Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs.
我怀疑您在 macOS 上安装了更新的 Eigen 版本。 normalize()
的行为已在一段时间前更改:
https://bitbucket.org/eigen/eigen/commits/12f866a746
这里有关于预期行为的讨论:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=977
为什么我在 Mac 和 Windows 上使用 Eigen 这个简单的 3d 矢量运算看到不同的结果?
我在 MacBook Pro (macOS 10.12.6) 上编写了一些模拟代码并对其进行了广泛测试。当我的同事尝试在 Windows 上使用它时,他遇到了问题。他给了我一个具体的失败案例。它对我有用。正如我们挖掘的那样,它归结为对 3d 零向量进行归一化的尝试,因此尝试除以零。他得到了 (nan, nan, nan) 而我得到了 (0, 0, 0)。在它发生的上下文中,零结果是 soft/harmless 失败,这就是为什么我在测试中没有注意到它。
显然 nans 向量是正确的答案。我在 Vagrant 下的 Ubuntu build 运行 中尝试了它并得到了 (-nan, -nan, -nan).
有人知道为什么我在 macOS 上得到 (0, 0, 0) 吗?我认为默认情况下 Xcode 正在使用 LLVM。 Ubuntu 构建使用了 clang。
检查你的编译器标志。您可能启用了快速数学运算(gcc 中的-ffast-math
)。这会启用 -ffinite-math-only
(同样是 gcc),而我 quote:
Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs.
我怀疑您在 macOS 上安装了更新的 Eigen 版本。 normalize()
的行为已在一段时间前更改:
https://bitbucket.org/eigen/eigen/commits/12f866a746
这里有关于预期行为的讨论:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=977