2015-04-07 75 views
1

Boost爲浮點值提供了一個很好的多精度庫,但glm不允許將它與矢量或矩陣相乘或幾乎任何東西,因爲它不知道這是什麼。將glm :: vec3與boost多精度浮點數相乘

所以下面的代碼不會編譯:

#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

好像多倍不會被其它庫接受..

模板將節省大量的代碼,但在最後,一個人必須要專門針對不同的操作!而且,當將mp_float與T相乘,並且如果T是float時,可​​能最終出現同樣的問題,然後回到階段0!

到目前爲止最好的辦法是避免使用glm庫的boost multiprecision,並使用numeric_limits控制精度並將數字四捨五入到小數點後6位。

這就是我最終使用它,它的作品就像一個魅力!

1

可以重載操作符,而包裝類:

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

注意,雖然,glm::vec3僅持有正常float S,所以你會失去一些精度這樣不管你怎麼做到這一點。

+0

好的建議! 是的,我知道你可以做到這一點,但我試圖避免運營商超載作爲一個漏洞,因爲我將不得不重載幾乎所有的運營商和vec3的,vec4的,mat3的,mat4's ..等等!不是我想花我的時間做的事情!! :P 不幸的是,glm :: detail :: tvec3 不能用於與另一個數字(int或float或mp_float)相乘。所以行:glm :: detail :: tvec3 v3 = a * foo;即使「foo」和「a」是mp_float類型也不會編譯。 –

+0

更新:你甚至不能定義一種類型的glm :: detail :: tvec3 golf; –

+0

啊,所以你不能。看起來你只限於使用平凡複製構造函數的類型。我從我的答案中編輯了那部分內容。 我能想到的另一件事是將重載定義爲模板,以便您不必爲每個向量/矩陣類型重新定義它們:'template T operator *(T v,mp_float f){return v * f.convert_to (); }' – Mike