在C++中,float佔4個字節,double佔8個字節,均採用 IEEE 754 浮點標準;內部都是以二進制爲基礎,表述實數,有些實數能夠被精確表述,好比0.2,但有些不行,好比0.3。針對這一點,前不久有篇專門的文章介紹這個:浮點運算爲何不許?有人爲0.30000000000000004建了個網站ios
爲了可以表述更高精度的浮點數,就得向庫方向查找了。gmp, mpfr 能夠表述無限精度,但編譯只能gcc吧,boost在1.56版時開始提供 boost.multiprecision 用於支持更高精度數值表述,許可證較其餘庫寬鬆,但在計算效率等方向要遜於gmp, mpfr。c++
好比採用 bbp 公式計算 pi 的精確結果,代碼以下:網站
// Author: bitbybit3d@163.com #include <iostream> #include <iomanip> #include <boost/math/constants/constants.hpp> #include <boost/multiprecision/cpp_bin_float.hpp> // 經過 BBP 公式計算 PI template <class Type> Type calc_pi_bbp(int n) { Type pi = 0; std::streamsize prevsize = std::cout.precision(50); for (int k = 0; k < n; ++k) { Type it = static_cast<Type>(1) / pow(16, k) * (static_cast<Type>(4) / (8 * k + 1) - static_cast<Type>(2) / (8 * k + 4) - static_cast<Type>(1) / (8 * k + 5) - static_cast<Type>(1) / (8 * k + 6)); pi += it; std::cout << std::left << std::setw(8) << k << pi << std::endl; } std::cout.precision(prevsize); return pi; } int main(int argc, char* argv[]) { std::cout << "Use double: " << std::endl; calc_pi_bbp<double>(20); std::cout << std::endl; std::cout << "Use boost multiprecision: " << std::endl; calc_pi_bbp<boost::multiprecision::cpp_bin_float_100>(30); return 0; }
以double值計算20次結果以下:
操作系統
再以boost.multiprecision計算30次結果以下:
3d
明顯使用double計算時,第10次以後就每沒有什麼變化了(小於2.2204460492503131e-016 (即DBL_EPSILON)的值與 1.0 相加仍然爲1.0),而boost.multiprecision還一直在變化,而且結果能夠與Window操做系統中計算器存儲的pi值相同(但小數點以後更多數字,這些準不許確就沒比較了)。code