2015-03-31 20 views
8

Jestem trochę stucked z przechowywaniem numer z maksymalną dostępną precyzją:Jak przechowywać dwukrotnie z maksymalną precyzją

double tmp = 569.232306826889043804840184748172760009765625L; 

próbuję wydrukować go na ekranie:

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

I że to, co mam:

569,2323068268890400000000000000000000000000000000000000

Czy to maksymalna precyzja, jaką mogę osiągnąć?

P.S. Używam programu Visual Studio 2008

+2

W C++ można użyć ['std :: numeric_limits'] (http://en.cppreference.com/w/cpp/types/numeric_limits), aby poznać ograniczenia i precyzję. –

+0

Należy również pamiętać, że nie tylko precyzja, ale i dokładność. Wiele liczb dziesiętnych nie może być dokładnie reprezentowanych przez zmiennoprzecinkowe. –

+2

'Trochę utknąłem z przechowywaniem numeru z maksymalną dostępną precyzją' Dlaczego utknąłem? Po prostu zadeklaruj "podwójne" (lub "długie podwójne"), a tam masz swoją "maksymalną precyzję". W przeciwnym razie nie rozumiem w pełni twojego pytania. – PaulMcKenzie

Odpowiedz

14

Podwójny jest zwykle przechowywany w formacie IEEE 754 binary64.

Binary64 ma 52 bitów precyzji, a nie 52 cyfr dziesiętnych - jest to odpowiednik co najwyżej 17 cyfr dziesiętnych, które właśnie wyświetlasz.


Jest to maksymalna precyzja, które mogę osiągnąć?

Niektóre platformy może zapewnić long double która jest faktycznie większy niż double, ale twój nie wydaje się.

Jeśli chcesz uzyskać większą precyzję, możesz użyć biblioteki, która eksponuje większy/bardziej precyzyjny typ obsługiwany przez Twój sprzęt (taki jak 80-bitowe podwójne rozszerzenie) lub bibliotekę dowolnej precyzji, która działa w oprogramowaniu.

+0

Język nie określa precyzji słowa "podwójny", ale określa minimalne wymagania. 52 bitów jest typowe, ale nie wymagane. –

+0

Mówiąc dokładniej, ta odpowiedź opisuje niektóre cechy podwójnej precyzji binarnej IEEE-754 ("binary64").Jest to format zmiennoprzecinkowy właściwy dla pytania, ale nie należy sugerować, że C wymaga implementacji, aby użyć tego formatu jako reprezentacji typu "double". Jest to jednak zdecydowanie najczęstszy wybór w dzisiejszych czasach. –

+0

Obie dobre strony, które edytowałem z pewną dokładnością. – Useless

6

To jest precyzja typu double w implementacji języka C. Implementacje Conformant C mają także typ long double, który może zapewniać większą precyzję .

Jeśli potrzebujesz więcej precyzji niż to, istnieją biblioteki numeryczne, które zapewniają arbitralne precyzyjne typy i funkcje liczbowe, aby na nich działać. Jednym z nich jest GNU Multiple Precision Arithmetic Library; działa na wielu platformach, w tym także dla Ciebie - Win32 i Win64.

+0

Połączona strona zawiera "Wiadomo, że działa również w systemie Windows zarówno w trybie 32-bitowym, jak i 64-bitowym.". – cremno