[英]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
}
有没有一种方法可以使这项工作工作而不必去编写类包装器和运算符重载成员函数? (我真的很想避免这种情况)
或者,如果有人知道另一种与glm和高精度数字相乘的方法,我将不胜感激。
谢谢
您可以在没有包装类的情况下重载运算符:
glm::vec3 operator *(mp_float f, glm::vec3 v) {
// ...
}
但是请注意, glm::vec3
只保存普通的float
,因此无论您怎么做,您都会失去一些精度。
似乎多精度不被其他库接受。
模板将节省大量代码,但最后,必须专门处理不同的操作! 同样,将mp_float与T乘以同样可能会遇到相同的问题,如果T为float,则返回到阶段0!
到目前为止,最好的办法是避免在glm库中使用boost多精度,并通过numeric_limits控制精度并将数字四舍五入到小数点后6位。
那就是我最终使用的东西,它就像一种魅力!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.