2015-03-31 61 views
8

我有點stucked與存儲與最大可用精度數雙存儲:如何進行最高精度

double tmp = 569.232306826889043804840184748172760009765625L; 

我想打印在屏幕上:

printf("%0.52f\n", tmp); 

而且這就是我的本錢:

569.2323068268890400000000000000000000000000000000000000

這是我能達到的最大精度嗎?


P.S.我正在使用Visual Studio 2008

+2

在C++中,您可以使用['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits)找出限制和精度。 – 2015-03-31 15:27:44

+0

你還應該記住,不僅精度高而且準確。很多十進制數不能完全用浮點表示。 – 2015-03-31 15:31:20

+2

'我有點困惑,儲存號碼的最大可用精度爲什麼卡住了?只需聲明一個'double'(或'long double'),並且在那裏你有「最高精度」。否則,我不完全瞭解你的問題。 – PaulMcKenzie 2015-03-31 15:32:27

回答

14

一個double通常以IEEE 754 binary64格式存儲。

binary64有52位的位數的精度,而不是52位十進制數字 - 這相當於最多17位十進制數字,這就是您顯示的內容。


這就是我所能達到的最大精度?

一些平臺可以提供long double這實際上是比double大,但你似乎沒有。

如果您想要更高的精度,您可以使用公開某些硬件支持的更大/更精確類型的庫(例如80位擴展雙精度)或者使用軟件工作的任意精度庫。

+0

該語言沒有指定'double'的精度,儘管它確實規定了最低要求。 52位是典型的,但不是必需的。 – 2015-03-31 15:31:44

+0

準確地說,這個答案描述了IEEE-754二進制雙精度(「binary64」)格式的一些特性。這是與問題相關的浮點格式,但不應該暗示C需要實現將該格式用作'double'類型的表示。儘管如此,這是迄今爲止最常見的選擇。 – 2015-03-31 15:33:55

+0

這兩個好處,我編輯了一些準確性。 – Useless 2015-03-31 15:36:25

6

這就是C實現中的double類型的精度。符合的C實現也有一個類型long double,其中可能提供更高的精度。

如果您需要更多的精度,那麼有數字庫提供任意精度的數字類型和函數來操作它們。 GNU Multiple Precision Arithmetic Library就是這樣一個;它可以在很多平臺上運行,包括與你相關的平臺 - Win32和Win64。

+0

鏈接的網站包含「它也被稱爲在32位和64位模式下的Windows上工作。」。 – cremno 2015-03-31 15:58:57