将 glm::vec3 与 boost 多精度浮点数相乘

Multiply glm::vec3 with boost multiprecision float

Boost 为浮点值提供了一个非常棒的多精度库,但 glm 不允许将它与向量或矩阵或几乎任何东西相乘,因为它不知道它是什么。

所以下面的代码编译:

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <glm/glm.hpp>

int main()
{
    typedef boost::multiprecision::cpp_dec_float_50 mp_float;

    float a = 0.1f;
    mp_float b = 0.1f;

    glm::vec3 foo(1.f,1.f,1.f);

    glm::vec3 v1 = a * foo; // OK
    glm::vec3 v2 = b * foo; // COMPILER ERROR
}

有没有一种方法可以使这项工作无需编写 class 包装器和运算符重载成员函数? (我真的很想避免这种情况)

或者,如果有人知道另一种与 glm 和高精度数字相乘的方法,我将不胜感激。

谢谢

你可以在没有包装器的情况下重载运算符 类:

glm::vec3 operator *(mp_float f, glm::vec3 v) {
    // ...
}

但是请注意,glm::vec3 仅适用于正常的 floats,因此无论您如何操作,您都会失去一些精度。

似乎其他库不接受多精度..

模板会节省很多代码,但最终还是要专门针对不同的操作!此外,将 mp_float 与 T 相乘时也可能会遇到同样的问题,如果 T 是浮点数,则返回阶段 0!

到目前为止,最好的办法是避免将 boost 多精度与 glm 库一起使用,并使用 numeric_limits 控制精度并将数字四舍五入到小数点后 6 位。

这就是我最终使用的,它就像一个魅力!