2016-12-05 14 views
-4

最小的雙數是2.22507e-308。有什麼方法可以使用較小的數字嗎? 我找到一個名爲gmp的庫,但不知道如何使用它,文檔根本不清楚,我不確定它是否可以在Windows上使用。如何定義和使用小於2e-308的數字

我不希望給我說明,但可能至少有一些建議。

+0

你使用哪種編譯器? – 2016-12-05 16:00:05

+0

'double'是CPU完美處理的一種類型,CPU'浮動'(而不是整數)寄存器一次可以正常工作8個字節。你能否給出一個「小數字」必要性的理由? – Ripi2

+0

我使用Visual Studio,它是本地編譯器。 – user1956641

回答

1

如果你需要真的很大的精度,那麼給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 
1

如果你的編譯器/架構允許它,你可以使用類似於long double的東西,編譯成80位浮點數(儘管我認爲它與128位對齊,所以存在一些浪費的空間),並且具有比典型更多的範圍和精度值爲double。儘管並非所有的編譯器都會這樣做,並且在許多編譯器上,long double相當於64位的double

「gmp」是一個庫,可用於擴展精度浮點數。我一般建議boost.multiprecision,其中包括GMP,雖然就個人而言,我會用我的多倍需求cpp_bin_floatcpp_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; 
1

如果你改變你的編譯器gccIntellong double將更大precission(80位支持)。使用默認的Visual Studio編譯器,我不知道該怎麼做。

相關問題