2015-04-07 2 views
1

Boost предлагает библиотеку с несколькими значениями для значений с плавающей запятой, которая является удивительной, но glm не позволяет ее умножать на вектор или матрицу или почти все, что не знает что это.Умножьте glm :: vec3 с boost multiprecision float

Поэтому код ниже делает не компиляция:

#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 и высокой точности, я был бы признателен.

Спасибо

ответ

1

Похож multiprecision не принимаются другой LIBS ..

шаблонов сэкономят много кода, но в конце концов, можно было бы специализироваться для различных операций! Кроме того, в одной и той же проблеме можно привести при умножении mp_float на T, а если T - float, то обратно на этап 0!

Самое лучшее, что до сих пор заключается в том, чтобы избежать использования boost multiprecision с библиотекой glm и контролировать точность с помощью numeric_limits и округлять числа до шести знаков после запятой.

Это то, что я в конечном итоге использовал, и это работает как шарм!

1

Вы можете перегрузить операторы без классов-оболочек:

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

Примечания, однако, что glm::vec3 имеет место только нормальные float с, так что вы потеряете некоторую точность делать это независимо от того, как вы сделай это.

+0

Хорошее предложение! Да, я знаю, что вы можете это сделать, но я стараюсь избежать перегрузки оператора как дыры, так как мне придется перегружать почти всех операторов, а для vec3, vec4, mat3, mat4's..etc! Не то, что я хочу провести свое время. : P К сожалению, glm :: detail :: tvec3 не работает ни при умножении с другим номером, ни на int, либо на float или mp_float. Итак, строка: glm :: detail :: tvec3 v3 = a * foo; не будет компилироваться, даже если «foo» и «a» имеют тип mp_float. –

+0

UPDATE: вы даже не можете определить тип glm :: detail :: tvec3 golf; –

+0

А, так вы не можете. Похоже, вы ограничены типами тривиальных конструкторов копий. Я отредактировал эту часть из моего ответа. Другая вещь, о которой я могу думать, - это определение перегрузок в виде шаблонов, так что вам не нужно переопределять их для каждого типа вектора/матрицы: 'template T operator * (T v, mp_float f) {return v * f.convert_to (); } ' – Mike