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 ?

Author: legends2k, 2009-12-04

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.

 412
Author: Steve Jessop,
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
 62
Author: pmg,
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.

 24
Author: Carl Smotricz,
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) zamiast 0x7FF (2047, który oznacza NaN 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.

 12
Author: Simon Biber,
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.

 8
Author: Dolphin,
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
 4
Author: Jay,
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.

 1
Author: Jerry Coffin,
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