największa liczba całkowita, która może być przechowywana w podwójnej
Jaka jest największa "nie-pływająca" liczba całkowita, która może być przechowywana w podwójnym typie IEEE 754 bez utraty precyzji ?
7 answers
Największa / Największa liczba całkowita, która może być przechowywana w dwójce bez utraty precyzji, jest taka sama jak największa możliwa wartość dwójki. Czyli DBL_MAX
lub w przybliżeniu 1.8 × 10308 (Jeśli twój sobowtór jest 64-bitowym sobowtórem IEEE 754). To liczba całkowita. Jest dokładnie reprezentowany. Czego jeszcze chcesz?
Dalej, Zapytaj mnie, jaka jest największa liczba całkowita, tak, że i wszystkie mniejsze liczby całkowite mogą być przechowywane w 64-bitowym standardzie IEEE bez utraty precyzji. IEEE 64-bit double ma 52 bity mantissy, więc myślę, że to 253:
- 253 + 1 nie można zapisać, ponieważ 1 na początku i 1 na końcu mają zbyt wiele zer pomiędzy.
- Wszystko mniej niż 253 może być przechowywany, z 52 bitami jawnie zapisanymi w mantysie, a następnie wykładnik w efekcie daje kolejny.
- 253 Oczywiście może być przechowywany, ponieważ jest to mała moc 2.
Lub inny sposób patrzenia na to: gdy błąd został zdjęty z wykładnika i ignorując bit znaku jako nieistotny dla pytania, wartość przechowywana przez podwójne jest potęgą 2, plus 52-bitowa liczba całkowita pomnożona przez 2wykładnik-52 . Więc z exponent 52 można zapisać wszystkie wartości z 252 Przez do 253 - 1. Następnie z wykładnikiem 53, następny numer można zapisać po 253 na 253 + 1 × 253 - 52. Tak więc utrata precyzji następuje najpierw z 253 + 1.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 13:18:26
9007199254740992 (to 9.007.199.254.740.992) bez gwarancji:)
Program
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
Wynik
9007199254740991 9007199254740992 9007199254740992
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 18:54:31
Wikipedia ma to do powiedzenia w tym samym kontekście z linkiem do IEEE 754:
W typowym systemie komputerowym, 'Podwójna precyzja' (64-bitowa) binarna Liczba zmiennoprzecinkowa ma współczynnik 53 bitów( z których jeden jest implikowany), wykładnik 11 bitów i jeden bit znaku.
2^53 to nieco ponad 9 * 10^15.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 18:46:14
Największa liczba całkowita, która może być reprezentowana w IEEE 754 double (64-bit), jest taka sama jak największa wartość, którą może reprezentować Typ, ponieważ sama ta wartość jest liczbą całkowitą.
Jest to reprezentowane jako 0x7FEFFFFFFFFFFFFF
, które składa się z:
- znak 0 (dodatni) zamiast 1 (ujemny)
- maksymalny wykładnik
0x7FE
(2046, który reprezentuje 1023 po odjęciu odchylenia) zamiast0x7FF
(2047, który oznaczaNaN
lub nieskończoność). - maksymalna mantissa
0xFFFFFFFFFFFFF
, czyli 52 bity wszystkie 1.
W systemie binarnym, wartością jest implicit 1, a następnie kolejne 52 Z mantysy, następnie 971 zer (1023-52 = 971) z wykładnika.
Dokładna wartość dziesiętna jest:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Jest to około 1,8 x 10308.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 05:22:59
Musisz spojrzeć na rozmiar mantissy. IEEE 754 64-bitowa liczba zmiennoprzecinkowa (która ma 52 bity, plus 1 implikowany) może dokładnie reprezentować liczby całkowite o wartości bezwzględnej mniejszej lub równej 2^53.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 19:10:26
1.7976931348623157 × 10^308
Http://en.wikipedia.org/wiki/Double_precision_floating-point_format
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 18:13:38
DECIMAL_DIG
z <float.h>
powinno dać co najmniej rozsądne przybliżenie tego. Ponieważ dotyczy to cyfr dziesiętnych, a tak naprawdę jest przechowywana w postaci binarnej, prawdopodobnie możesz przechowywać coś małego większego bez utraty precyzji, ale dokładnie ile trudno powiedzieć. Przypuszczam, że powinieneś być w stanie to rozgryźć z FLT_RADIX
i DBL_MANT_DIG
, ale nie jestem pewien, czy całkowicie zaufam rezultatowi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 18:21:25