最小的雙數是2.22507e-308。有什麼方法可以使用較小的數字嗎? 我找到一個名爲gmp的庫,但不知道如何使用它,文檔根本不清楚,我不確定它是否可以在Windows上使用。如何定義和使用小於2e-308的數字
我不希望給我說明,但可能至少有一些建議。
最小的雙數是2.22507e-308。有什麼方法可以使用較小的數字嗎? 我找到一個名爲gmp的庫,但不知道如何使用它,文檔根本不清楚,我不確定它是否可以在Windows上使用。如何定義和使用小於2e-308的數字
我不希望給我說明,但可能至少有一些建議。
如果你需要真的很大的精度,那麼給gmp
的機會。我相信它也可以在Windows上運行。
如果您只需要比double
更大的精度,請嘗試long double
。它可能會或可能不會給你更多,取決於你的編譯器和目標平臺。
對我來說,它確實給更多(海合會6,x86_64的Linux版):
測試程序:
#include <iostream>
#include <limits>
int main() {
std::cout << "float:"
<< " bytes=" << sizeof(float)
<< " min=" << std::numeric_limits<float>::min()
<< std::endl;
std::cout << "double:"
<< " bytes=" << sizeof(double)
<< " min=" << std::numeric_limits<double>::min()
<< std::endl;
std::cout << "long double:"
<< " bytes=" << sizeof(long double)
<< " min=" << std::numeric_limits<long double>::min()
<< std::endl;
}
輸出:
float: bytes=4 min=1.17549e-38
double: bytes=8 min=2.22507e-308
long double: bytes=16 min=3.3621e-4932
如果你的編譯器/架構允許它,你可以使用類似於long double
的東西,編譯成80位浮點數(儘管我認爲它與128位對齊,所以存在一些浪費的空間),並且具有比典型更多的範圍和精度值爲double
。儘管並非所有的編譯器都會這樣做,並且在許多編譯器上,long double
相當於64位的double
。
「gmp」是一個庫,可用於擴展精度浮點數。我一般建議boost.multiprecision,其中包括GMP,雖然就個人而言,我會用我的多倍需求cpp_bin_float
或cpp_dec_float
(前者是IEEE756標準,後者則不是)
至於如何使用它們:我的天堂」 t一起使用GMP,所以我不能在它的語法發表評論,但cpp_bin_float
是很容易使用:
typedef boost::multiprecision::cpp_bin_float_quad quad;
quad a = 34;
quad b = 17.95467;
b += a;
for(int i = 0; i < 10; i++) {
b *= b;
}
std::cout << "This might be rather big: " << b << std::endl;
如果你改變你的編譯器gcc
或Intel
型long double
將更大precission(80位支持)。使用默認的Visual Studio編譯器,我不知道該怎麼做。
你使用哪種編譯器? – 2016-12-05 16:00:05
'double'是CPU完美處理的一種類型,CPU'浮動'(而不是整數)寄存器一次可以正常工作8個字節。你能否給出一個「小數字」必要性的理由? – Ripi2
我使用Visual Studio,它是本地編譯器。 – user1956641