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和高精度数字的方法,我将不胜感激。
谢谢
答案 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位。
这就是我最终使用的东西,它就像一个魅力!