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



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
}

有没有一种方法可以在不必编写类包装器和运算符重载成员函数的情况下实现这一点?(我真的很想避免这种情况)

或者,如果有人知道另一种用glm和高精度数字相乘的方法,我会很感激

感谢

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

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

不过,请注意,glm::vec3只保存正常的floats,因此无论如何操作,都会丢失一些精度。

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

模板将保存大量代码,但最终,必须专门用于不同的操作!此外,当mp_float与T相乘时,可能会出现同样的问题,如果T是float,则返回阶段0!

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

这就是我最终使用的东西,它就像一个符咒!

最新更新