Est-il raisonnable de supposer que n'importe quelle quantité physique peut être représentée par un entier 64 bits sans débordement ni débordement?

31

L'algorithme de recherche binaire d'origine dans le JDK utilisait des entiers 32 bits et avait un bogue de débordement si (low + high) > INT_MAX( http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html ) .

Si nous réécrivons le même algorithme de recherche binaire à l'aide d'entiers 64 bits (signés), pouvons-nous supposer qu'il low + highne dépassera jamais INT64_MAX car il est physiquement impossible d'avoir 10 ^ 18 octets de mémoire?

Lorsque vous utilisez des entiers 64 bits (signés) pour représenter des quantités physiques , est-il raisonnable de supposer que le dépassement et le dépassement ne peuvent pas se produire?

Siqi Lin
la source
4
Regardez tout phénomène physique auquel un nombre irrationnel est associé. Cercles et pi par exemple. Les nombres à virgule flottante sont intrinsèquement rationnels, vous ne pouvez donc pas le représenter parfaitement sans erreur.
Thomas Eding
92
Le nombre d'atomes dans le soleil est d'environ 1,2e57, ce qui correspond à un entier non signé de 190 bits. Par contradiction, 64 bits ne peuvent pas être suffisamment grands pour représenter une quantité physique.
6
Le titre de votre question est trompeur. Vous devriez demander "y a-t-il des quantités pour lesquelles on peut s'attendre à ce qu'une application utilise un tableau trié de taille supérieure à 2 ^ 64?"
Doc Brown
7
ou le nombre de yoctosecondes depuis que vous avez commencé à lire ce commentaire.
Jodrell
4
Il fut un temps où tout le monde pensait qu'il n'y aurait jamais 2 ^ 32 ordinateurs connectés les uns aux autres. Vous ne voulez pas que vos atomes doivent utiliser NAT, n'est-ce pas?
Sebb

Réponses:

58

La réponse courte est non. Cependant, pour certaines applications, votre hypothèse peut être correcte.

En supposant un entier signé, 2 ^ 63, avec des virgules ajoutées pour plus de clarté, = 9,223,372,036,854,775,808. C'est donc à peu près 9 * 10 ^ 18. 10 ^ 18 est un "Exa".

Wikipédia dit: "En 2013, le World Wide Web aurait atteint 4 zettaoctets. [12]", soit 4 000 exaoctets. Par conséquent, le WWW est environ 400 fois plus grand que 2 ^ 63 octets.

Par conséquent, il existe au moins une quantité physique qui est beaucoup plus grande qu'un entier 64 bits signé (ou non signé). En supposant que vos unités sont des octets . Si vos unités étaient quelque chose de beaucoup plus grand, comme GigaBytes, alors vous seriez d'accord, mais votre précision de mesure serait faible.

Pour un autre exemple, considérons les galaxies lointaines. La galaxie d'Andromède est en fait l'une des plus proches, et elle se trouve à 2,5 * 10 ^ 6 années-lumière. Si vos unités étaient des miles , ce serait 14,5 * 10 ^ 18, plus qu'un entier signé de 64 bits. Maintenant, cela dépend évidemment des unités que vous utilisez pour vos mesures, mais certaines galaxies sont bien plus éloignées qu'Andromède. ( Le plus connu est à 13 * 10 ^ 9 LY de distance. ) Selon la précision que vous souhaitez pour votre mesure, elle peut déborder d'un entier de 64 bits.

( Ajouté ) Oui, les miles sont une unité minable pour la distance astronomique. Une unité plus normale pourrait être une unité astronomique , à environ 150 millions de kilomètres. En utilisant cette unité de mesure, la galaxie la plus éloignée connue est d'environ 10 ^ 15 AU (si mes calculs sont exacts), ce qui correspondrait à un int de 64 bits. Cependant, si vous souhaitez également mesurer la distance à la Lune, aux satellites en orbite à proximité, cette unité est trop grande.

Un autre exemple de l'électronique: le Farad (F), une unité de capacité . Les grands condensateurs vont jusqu'à 5kF. Et ce nombre augmentera probablement avec le temps à mesure que les voitures hybrides, les «réseaux intelligents», etc. s'améliorent. Une fois peut mesurer une capacité aussi petite que 10 ^ -18 F. Ainsi, la plage globale de capacité "réelle" que nous pouvons mesurer aujourd'hui est de 5 * 10 ^ 21, plus grande qu'un entier de 64 bits.

user949300
la source
3
Tout cela est vrai, mais d'un point de vue pratique, nous pouvons remettre en question le point de mesure de la distance de la galaxie d'Andromède de la Voie lactée en miles (où sont exactement le point de référence?) Ou le WWW entier en octets (avec cette précision, il change toutes les millisecondes)
Jivan
45
@Jivan D'un point de vue pratique, je ne vois aucune raison pour laquelle vous auriez besoin d'adresser plus de 640 Ko de mémoire. C'est certainement plus que ce dont vous auriez jamais besoin.
ArTs
2
Un autre inconvénient de la mesure des distances astronomiques en miles: vous êtes susceptible d'être battu avec un chat.
Williham Totland, le
2
@Jivan Bon point. Cela me rappelle Richard Feynman en train de se plaindre de la bêtise de sommer la température d'un groupe d'étoiles. Je vois pourquoi vous voudriez la moyenne, le minimum, le maximum, mais la somme? Quelle signification physique est-ce?
piojo
6
@piojo - il est vrai que la somme est utile pour calculer la moyenne.
Scott Whitlock
20

Vous n'avez même pas besoin de devenir cosmique lorsque la combinatoire est impliquée. Il y a 2 ^ 95 offres possibles dans un jeu de bridge et c'est du petit côté de la complexité.

msw
la source
On peut se demander si cela compte comme une "quantité physique".
Paul Draper
2
En revanche, la combinatoire impliquée en chimie ou en mathématiques serait qualifiée de "physique".
rwong
@PaulDraper si vous aviez suffisamment de jeux de cartes pour disposer sur le terrain toutes ces transactions, ce serait physique. Ensuite, vous auriez encore plus de 2 ^ 95 cartes impliquées.
Brad
1
@Brad, je pense que l'OP demande une quantité qui "existe" (d'accord, l'existence est un concept flou). 2 ^ 95 cartes qui satisfont un concept mathématique n'existent pas (appelez Guinness si elles existent). Il est difficile de dire ce qui "compte" et ce qui ne l'est pas. Cette réponse ne satisfait tout simplement pas ma notion spongieuse d'une quantité physique.
Paul Draper
17

La quantité physique la plus pertinente pour votre question est la RAM de l'ordinateur .

Windows Server 2012 prend en charge jusqu'à 4 To de mémoire physique. C'est 2 42 octets. Si les capacités de RAM continuent de doubler chaque année, alors dans seulement 17 ans, "Windows Server 2032" prendra en charge 2 62 octets de mémoire physique, date à laquelle vous low + highatteindrez 2 63 - 2 et embrasserez l'entier 64 bits maximum signé.

J'espère qu'aucun système critique pour la sécurité ne tombe en panne, en supposant que 64 bits seront toujours suffisants.

Pour une utilisation un peu plus générale, la quantité physique la plus pertinente est l' espace d'adressage mémoire . (Il est utile d'avoir un espace d'adressage beaucoup plus grand que la mémoire physique, par exemple pour mettre de nombreuses piles en mémoire, toutes avec de la place pour croître.) Les implémentations actuelles x86-64 prennent en charge les adresses virtuelles 48 bits, nous n'avons donc que 14 ans avant que ces CPU atteignent la limite d'espace d'adressage de 2 62 octets.

Et puis il y a la mémoire partagée distribuée "où les mémoires (physiquement séparées) peuvent être adressées comme un seul espace d'adressage (logiquement partagé)".

Jerry101
la source
4
+1 Votre réponse est presque exacte, sauf que certains types de logiciels actuels rencontrent déjà des adresses de mémoire dans la plage 0xFFFFFFFFxxxxxxxx(c'est -à- dire la moitié supérieure ), par exemple le système d'exploitation ou les pilotes de périphérique.
rwong
2
@SiqiLin probablement pas en ce qui concerne l'informatique personnelle. Cependant, la mémoire partagée distribuée, ou le DGAS (mentionné dans l'article) sont réels; les superordinateurs fonctionnent dans ce style depuis des années et il est possible que cela devienne la norme pour les infrastructures de cloud computing multinationales. Apparemment, le code logiciel typique écrit par le programmeur type ne fonctionnera pas dans un tel environnement - les environnements inhabituels exécutent des logiciels inhabituels (c'est-à-dire infrastructurels). Mais une fraction des lecteurs de P.SE pourrait bien atterrir sur une telle carrière; Au cas où.
rwong
1
@Joshua: Avec la technologie actuelle (32 Go DDR4) qui serait de 7m ou 23 ns pour que la lumière se déplace, ce qui semble parfaitement en ligne avec les latences CAS modernes. Si vous le poussez à l'extrême principe de Landauer, avec la densité du silicium, vous obtenez 31 nm ou 10 ^ -16 secondes pour la limite physique. Cela ne semble pas trop fou ... enfin, peut-être juste un peu.
Charles
3
@Joshua C'est une limite technologique, pas physique. (Comme dans, le problème est que nous ne savons pas comment le faire pratiquement, pas que certaines lois physiques l'interdisent.) Par conséquent, bien que pertinent cette semaine, il pourrait changer à tout moment avec une nouvelle percée. Il y a environ 60 ans, les gens auraient fait des commentaires très similaires aux vôtres, environ 50 kilo - octets de mémoire étant considérés comme de la RAM, au motif que les bobines de fil enroulées à la main qui étaient ensuite utilisées comme parties de noyaux de mémoire pouvaient non seulement devenir si petites et immobiles fonction, mais l'espace requis entre eux pour éviter la diaphonie EM.
Matthew Najmon
2
Je me souviens quand 24 bits d'espace d'adressage (16 mégaoctets) étaient plus que quiconque n'aurait jamais besoin - ou ne pourrait se permettre. :-)
Bob Jarvis - Rétablir Monica le
10

Est-il raisonnable de supposer que n'importe quelle quantité physique peut être représentée par un entier 64 bits sans débordement ni débordement?

Pas exactement. Il y a beaucoup de nombres qui sont à la fois plus grands et plus petits que cela, c'est pourquoi nous avons des nombres à virgule flottante. Les nombres à virgule flottante compensent une moindre précision pour une meilleure portée.

Dans l'exemple spécifique que vous avez cité, il est très peu probable que vous ayez besoin d'un nombre supérieur à cela. 64 bits correspondent à environ 18 quintillions d'éléments. Mais ne dis jamais jamais.

Robert Harvey
la source
7

Votre hypothèse ne gérera pas les quantités physiques qui ne peuvent être représentées que par des nombres à virgule flottante. Et même si vous avez décidé de mettre à l'échelle tous les nombres, par exemple en multipliant tous les nombres par 10000 (de sorte que les valeurs sont toujours des entiers mais peuvent être représentées en dix millièmes), ce schéma échoue toujours pour les nombres très proches de zéro, par exemple la masse électronique (9,1094 * 10⎻³¹ kg).

C'est une quantité physique très réelle (et extrêmement petite) , voici encore plus avec laquelle vous aurez des problèmes. Et si vous soutenez que ce n'est pas une vraie quantité physique (même si elle est en kg), considérez:

10 kg (obviously physical quantity)
1 kg (same)
10⎻² kg (1/100 kg, or about 1/3 ounce) (also quite real)

Vous voyez donc où je veux en venir. Le dernier que vous ne pouvez pas gérer non plus.

Bien sûr, vous pouvez avoir un champ spécial dans le nombre pour mettre à l'échelle une partie entière vers le haut ou vers le bas par un multiplicateur variable; gee maintenant vous venez d'inventer la virgule flottante.

tcrosley
la source
1
Mais vous pouvez attribuer une valeur physique minimale (IIRC, pour la masse, c'était la masse équivalente à 1 électron-volt). Par exemple, vous pouvez mesurer la longueur de l'univers à l'aide des unités de longueur de Planck avec (IIRC) 200 chiffres. Vous pouvez parler mentalement d' environ 1/10 d'une longueur de Planck, mais physiquement, cela n'a aucun sens.
SJuan76
Vous ne voulez pas dire diviser par 10000? La multiplication par 10000 rendrait simplement l'hypothèse de l'ouvre-fil plus susceptible d'échouer. Peut-être que mon appareil n'affiche pas la masse d'électrons correctement, mais elle devrait être de 10 ^ -31
Mike
Je veux dire multiplier par 10000. Si vous souhaitez stocker 1.0001 sous forme d'entier, vous devez le multiplier par 10000 avant de le stocker sous 10001. J'utilisais des caractères en exposant pour le -31, peut-être qu'ils ne s'affichent pas correctement sur tous les navigateurs . Regardez bien dans Firefox.
tcrosley
@ SJuan76 Il y a ce qu'on appelle la pérennité. En 1850, nous pourrions parler d'une unité de 10 ^ -20 mètres (beaucoup plus petite qu'un atome, mais toujours beaucoup plus grande qu'une longueur de Planck), mais physiquement, cela n'avait aucun sens. Ensuite, les gens ont compris la structure interne d'un atome. Bien sûr, les quarks semblent fondamentaux, mais tout ce que nous pouvons vraiment dire est (a) qu'ils agissent de manière cohérente avec la façon dont nous nous attendons à ce que les particules fondamentales se comportent, et (b) nous n'avons pas encore trouvé de prochaine tortue. En 1850, on pourrait dire les deux mêmes choses sur les atomes. Si nous trouvons une prochaine tortue, des unités de 1/10 de Planck deviennent très utiles.
Matthew Najmon
C'est une idée fausse que l'espace ou le temps sont quantifiés en unités Planck! Vous ne pouvez pas représenter l'univers par un tableau à 4 dimensions, du moins pas dans les théories actuelles ... Les fractions de longueurs de Planck sont donc physiquement significatives (mais les résultats issus de la relativité générale et / ou de la QM commencent à exploser ou se contredisent).
yatima2975
5

Je répondrais d'abord à la question de savoir quelles valeurs physiques peuvent / devraient être représentées par un nombre entier?

Un entier est une représentation d'un nombre naturel (et des différences entre eux) dans un système informatique, donc l'appliquer à autre chose est faux. Ainsi, invoquer des distances ou d'autres quantités appartenant au domaine continu n'est pas un argument. Pour de telles quantités, il existe des représentations de nombres réels. Et vous pouvez toujours choisir une unité arbitrairement grande et adapter n'importe quelle valeur avec une précision donnée.

Alors, quelles sont les valeurs physiques qui sont des nombres naturels et peuvent-elles déborder d'un entier 64 bits?

Je peux penser à deux. Nombre d'objets physiques (comme les atomes) et niveaux d'énergie dans lesquels un système quantique peut se trouver. Ce sont deux choses strictement entières. Maintenant, je sais que vous pouvez diviser un atome, mais il produit toujours une quantité entière et vous ne pouvez pas le diviser indéfiniment. Les deux peuvent facilement dépasser la plage 64 bits d'entier non signé . Le nombre d'atomes est plus élevé et un atome peut être dans plus d'un état énergétique.

Que l'information soit physique ou non, est très discutable. Je dirais que non. Par conséquent, je ne dirais pas que la quantité d'informations est une chose physique. Ce n'est donc pas la quantité de RAM ou quelque chose comme ça. Si vous le permettez, le nombre d'atomes dépasse facilement ce nombre, car vous avez besoin de plus d'un atome pour stocker un bit avec la technologie d'aujourd'hui.

luk32
la source
L'ensemble N de nombres naturels ne comprend que des entiers non négatifs. Je sais ce que vous vouliez dire, mais "nombre naturel" a une définition mathématique spécifique incompatible avec la façon dont vous l'utilisez.
Je ne suis pas vraiment sûr. Les types entiers représentent des nombres naturels (dans une plage donnée bien sûr, ce qui est implicite). N'est-ce pas vrai? Je pense que vous avez supposé que j'impliquais l'égalité entre les ensembles. Ce n'est pas vrai, tout nombre naturel peut être représenté par un entier. Veuillez noter que j'ai également dit des différences entre eux. Je n'avais pas l'impression qu'il était nécessaire de signer / non signé. Le type Singed n'est nécessaire que lorsque vous traitez avec des différences.
luk32
Alors que la physicalité des informations stockées est discutable, et une question pour les philosophes plus que pour les physiciens, la physicalité des mécanismes par lesquels elles sont stockées est tout à fait certaine. Par conséquent, bien que l'applicabilité à un certain nombre de bits d'informations soit discutable, le nombre de bits valant pour les puces RAM ne l'est pas.
Matthew Najmon
@MatthewNajmon Bien sûr, je suis d'accord, c'est pourquoi j'ai laissé la dernière phrase. Le nombre de bits d'une puce RAM sera inférieur au nombre d'atomes pendant un certain temps, vous pouvez donc utiliser ce dernier. En d'autres termes, pourquoi utiliser le nombre de bits, alors que vous pouvez utiliser le nombre d'atomes de la même puce RAM? Actuellement, un peu d'informations est représenté par un état dans lequel se trouve un système physique, vous pouvez donc stocker plus d'un bit par atome, mais c'est loin d'être une application de nos jours, et je ne vois toujours pas comment cela peut être plus que le nombre de états quantiques d'un tel système. Mais je suis totalement d'accord avec votre prémisse.
luk32
4

En plus de la réponse de Jerry101, je voudrais offrir ce test de correction très simple et pratique:

Supposons que vous allouiez de la mémoire via malloc, dans un système d'exploitation 64 bits. Supposons que l'allocateur de mémoire décide de vous renvoyer un bloc de mémoire valide, de la taille que vous avez demandée, mais où le 63e bit est défini.

En d'autres termes, supposons qu'il existe des environnements de programmation où se 0xFFFFFFFFxxxxxxxxtrouvent des plages de mémoire légitimes qui pourraient être renvoyées d'un appel à malloc.

La question est, votre code fonctionnera-t-il toujours comme prévu?

Lorsque la situation analogue se produit pour les systèmes d'exploitation 32 bits, certains logiciels ne fonctionnent pas correctement s'ils reçoivent des adresses mémoire "dans la moitié supérieure". À l'origine, ces adresses mémoire étaient censées être uniquement disponibles pour le code privilégié (systèmes d'exploitation, pilotes de périphériques et matériel périphérique), mais en raison de la pénurie d'espace d'adressage 32 bits, les fournisseurs de systèmes d'exploitation ont décidé de mettre une partie de cet espace réservé à la disposition de les applications qui le demandent.

Heureusement, cette situation est peu susceptible de se produire pour les programmes 64 bits pendant un certain temps, du moins pas dans une décennie.

Lorsque cette situation se produit enfin, cela signifie que les processeurs et systèmes d'exploitation adressables à 128 bits seraient devenus courants à ce moment-là, et qu'ils seraient en mesure de fournir un "environnement d'émulation 64 bits" pour permettre à ces "applications héritées" de fonctionner. sous des hypothèses similaires aux systèmes d'exploitation 64 bits d'aujourd'hui.

Enfin, notez que cette discussion se concentre uniquement sur les adresses mémoire. Un problème similaire avec les horodatages doit être pris avec plus de précaution, car certains formats d'horodatage allouent beaucoup de bits de précision aux microsecondes et laisse donc moins de bits disponibles pour représenter le temps à l'avenir. Ces problèmes sont résumés dans l'article de Wikipedia sur le problème de l'an 2038 .

rwong
la source
4

C'est une question que vous devez vous poser au cas par cas. Vous ne devriez pas utiliser une hypothèse générale selon laquelle l'arithmétique 64 bits ne débordera pas, car même lorsque les quantités correctes seront dans une plage beaucoup plus petite, une source de données malveillante pourrait finir par vous donner des quantités déraisonnables qui pourraient déborder, et il vaut mieux être préparé à cette situation que d'être touché par elle de façon inattendue.

Il y a des cas où il est logique d'écrire du code qui dépend du non-débordement des nombres 64 bits. La principale classe d'exemples que je connais est celle des compteurs, où le compteur est incrémenté chaque fois qu'il est utilisé. Même à un rythme d'un incrément par nanoseconde (ce qui n'est pas pratique), il faudrait plus d'un siècle pour déborder.

Notez que même si au premier abord il peut sembler "toujours faux en principe" de s'appuyer sur le "temps jusqu'à l'échec" pour l'exactitude d'un système, nous le faisons tout le temps avec authentification / connexion. Avec suffisamment de temps (pour le forçage brutal), un tel système (qu'il soit basé sur des mots de passe, des clés privées, des jetons de session, etc.) est cassé.

R ..
la source
2

Est-il POSSIBLE qu'une quantité physique ne tienne pas en 64 bits? Bien sûr. D'autres ont souligné le comptage du nombre d'atomes dans le soleil ou du nombre de millimètres jusqu'à la prochaine galaxie. La pertinence de tels cas pour votre application dépend de votre application. Si vous comptez le nombre d'articles dans un bac donné dans votre entrepôt, 16 bits seraient probablement suffisants. Si vous compilez des statistiques sur le nombre de personnes dans le monde remplissant diverses conditions, vous devez être en mesure d'enregistrer des milliards, vous aurez donc besoin de plus de 32 bits, auquel cas vous iriez probablement à 64 (comme peu d'ordinateurs ont un support intégré pour les nombres de 37 bits, etc.). S'il s'agit d'une application de chimie qui compte des moles d'atomes, 64 bits ne seront pas suffisants.

Techniquement, ce n'est pas parce qu'un ordinateur aujourd'hui a 2 ^ 64 octets de mémoire que l'index d'un tableau ne peut jamais dépasser 2 ^ 64. Il existe un concept appelé «tableau clairsemé» dans lequel de nombreux éléments du tableau ne sont physiquement stockés nulle part, et ces valeurs non stockées sont supposées avoir une valeur par défaut comme null ou zero. Mais je suppose que si vous écrivez une fonction pour rechercher un tableau ou une liste quelconque, et que la taille du champ que vous utilisez pour contenir l'index dans le tableau est plus du double de la plus grande adresse possible, puis vérifiez le débordement lorsque l'ajout de deux index ne serait pas strictement nécessaire.

Geai
la source
Bon point sur les tableaux clairsemés. De plus, même avec un tableau entièrement rempli, il est toujours tout à fait possible, quoique plutôt lent, et dans certains cas tout à fait nécessaire, de travailler avec un tableau trop grand pour s'adapter à l'intégralité du tableau dans la RAM à la fois. Cela se fait simplement en stockant le tout dans un support plus lent mais beaucoup plus grand, comme un disque dur, puis en tirant sur la RAM uniquement les quelques éléments avec lesquels vous travaillez en ce moment. Même un petit disque dur est suffisamment grand pour contenir une baie beaucoup plus grande que l'OP ne le suppose.
Matthew Najmon
0

Il est déraisonnable de supposer qu'un entier 64 bits peut contenir tous les nombres. Plusieurs raisons:

  1. Les entiers max et min 64 bits sont des nombres finis. Pour chaque nombre fini, un nombre fini plus grand et plus petit existe.

  2. Des calculs avec des nombres de 128 bits et 256 bits sont actuellement utilisés à divers endroits. De nombreux processeurs ont des instructions spécifiques qui fonctionnent sur des entiers de 128 bits.

  3. Il y a 20 ans, un disque de 1 Go était considéré comme "grand". Aujourd'hui, un disque de 1 To est considéré comme petit. Il y a 20 ans, les ordinateurs de bureau moyens avaient environ 16 Mo de RAM. Mon bureau actuel a plus de 16 Go de RAM. L'espace disque dur et la RAM ont connu une croissance exponentielle dans le passé et devraient croître de façon exponentielle à l'avenir. À moins que quelqu'un ne trouve une très bonne raison pour laquelle cela devrait cesser de croître, il n'est pas logique de supposer que cela s'arrêtera.

Peter
la source