将 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
仅适用于正常的 float
s,因此无论您如何操作,您都会失去一些精度。
似乎其他库不接受多精度..
模板会节省很多代码,但最终还是要专门针对不同的操作!此外,将 mp_float 与 T 相乘时也可能会遇到同样的问题,如果 T 是浮点数,则返回阶段 0!
到目前为止,最好的办法是避免将 boost 多精度与 glm 库一起使用,并使用 numeric_limits 控制精度并将数字四舍五入到小数点后 6 位。
这就是我最终使用的,它就像一个魅力!
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
仅适用于正常的 float
s,因此无论您如何操作,您都会失去一些精度。
似乎其他库不接受多精度..
模板会节省很多代码,但最终还是要专门针对不同的操作!此外,将 mp_float 与 T 相乘时也可能会遇到同样的问题,如果 T 是浮点数,则返回阶段 0!
到目前为止,最好的办法是避免将 boost 多精度与 glm 库一起使用,并使用 numeric_limits 控制精度并将数字四舍五入到小数点后 6 位。
这就是我最终使用的,它就像一个魅力!