将glm :: vec3与boost multiprecision float相乘

时间:2015-04-07 10:50:14

标签: c++ boost precision glm-math

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和高精度数字的方法,我将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

请注意,glm::vec3仅保留正常的float,因此无论您如何操作,都会失去一些精确度。

答案 1 :(得分:0)

似乎其他libs不接受multiprecision ..

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

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

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