it-swarm.com.de

Ist es vernünftig anzunehmen, dass jede physikalische Größe durch eine 64-Bit-Ganzzahl ohne Überlauf oder Unterlauf dargestellt werden kann?

Der ursprüngliche binäre Suchalgorithmus im JDK verwendete 32-Bit-Ganzzahlen und hatte einen Überlauffehler, wenn (low + high) > INT_MAX ( http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html ).

Wenn wir denselben binären Suchalgorithmus mit (vorzeichenbehafteten) 64-Bit-Ganzzahlen umschreiben, können wir davon ausgehen, dass low + high wird INT64_MAX niemals überschreiten, weil es physikalisch unmöglich ist, 10 ^ 18 Bytes Speicher zu haben?

Wenn Sie vorzeichenbehaftete 64-Bit-Ganzzahlen verwenden, um physikalische Größen darzustellen, ist es vernünftig anzunehmen, dass kein Unterlauf und kein Überlauf auftreten kann?

31
Siqi Lin

Die kurze Antwort lautet nein. Für einige Anwendungen ist Ihre Annahme jedoch möglicherweise richtig.

Angenommen, ein vorzeichenbehaftetes int, 2 ^ 63, mit Kommas zur Verdeutlichung = 9.223.372.036.854.775.808. Es ist also ungefähr 9 * 10 ^ 18. 10 ^ 18 ist eine "Exa".

Wikipedia sagt "Ab 2013 hat das World Wide Web schätzungsweise 4 Zettabyte erreicht. [12]", das sind 4000 Exabyte. Daher ist das WWW ungefähr 400-mal größer als 2 ^ 63 Bytes.

Daher gibt es mindestens eine physikalische Größe, die viel größer als eine vorzeichenbehaftete (oder vorzeichenlose) 64-Bit-Ganzzahl ist. Angenommen, Ihre Einheiten sind Bytes. Wenn Ihre Einheiten viel größer wären, wie GigaBytes, wären Sie in Ordnung, aber Ihre Messgenauigkeit wäre gering.

Betrachten Sie als weiteres Beispiel weit entfernte Galaxien. Die Andromeda-Galaxie ist tatsächlich eine der nahen und 2,5 * 10 ^ 6 Lichtjahre entfernt. Wenn Ihre Einheiten Meilen wären, wäre das 14,5 * 10 ^ 18, mehr als eine 64-Bit-Ganzzahl mit Vorzeichen. Natürlich hängt es von den Einheiten ab, die Sie für Ihre Messungen verwenden, aber einige Galaxien sind viel weiter entfernt als Andromeda. ( Die am weitesten bekannte ist 13 * 10 ^ 9 L.Y. entfernt. ) Abhängig von der Genauigkeit, die Sie für Ihre Messung wünschen, kann eine 64-Bit-Ganzzahl überlaufen.

( Hinzugefügt ) Ja, Meilen sind eine miese Einheit für die astronomische Entfernung. Eine normalere Einheit könnte eine Astronomische Einheit sein, ungefähr 93 Millionen Meilen. Unter Verwendung dieser Maßeinheit ist die am weitesten bekannte Galaxie ungefähr 10 ^ 15 A.U. (wenn meine Mathematik stimmt), die in ein 64-Bit-Int passen würde. Wenn Sie jedoch auch die Entfernung zum Mond und zu nahegelegenen umlaufenden Satelliten messen möchten, ist diese Einheit zu groß.

Ein weiteres Beispiel aus der Elektronik: der Farad (F), eine Kapazitätseinheit . Große Kondensatoren reichen bis zu 5 kF. Und diese Zahl wird wahrscheinlich im Laufe der Zeit zunehmen, wenn sich Hybridautos, "Smart Grids" usw. verbessern. Einmal kann eine Kapazität von nur 10 ^ -18 F gemessen werden. Der Gesamtbereich der "realen" Kapazität, den wir heute messen können, beträgt also 5 * 10 ^ 21 und ist größer als eine 64-Bit-Ganzzahl.

58
user949300

Sie müssen nicht einmal kosmisch werden, wenn es um Kombinatorik geht. Es gibt 2 ^ 95 mögliche Deals in einem Bridge-Spiel und das ist etwas klein in der Komplexität.

20
msw

Die relevanteste physikalische Größe für Ihre Frage ist Computer-RAM .

Windows Server 2012 nterstützt bis zu 4 TB physischen Speicher. Das ist 242 Bytes. Wenn sich die Kapazität RAM Kapazität) jedes Jahr weiter verdoppelt, wird in in nur 17 Jahren "Windows Server 2032" unterstützt 262 Bytes physischen Speichers, zu welchem ​​Zeitpunkt Ihr low + high wird 2 erreichen63 - 2 und küsse die maximal signierte 64-Bit-Ganzzahl.

Ich hoffe, dass keine sicherheitskritischen Systeme ausfallen, da 64 Bit immer ausreichen werden.

Für eine etwas allgemeinere Verwendung ist die relevanteste physikalische Größe der Speicheradressraum . (Es ist nützlich, einen viel größeren Adressraum als den physischen Speicher zu haben, z. B. um viele Stapel im Speicher abzulegen, die alle Platz zum Wachsen bieten.) Aktuelle x86-64 -Implementierungen unterstützen virtuelle 48-Bit-Adressen nur 14 Jahre bevor diese CPUs die 2 erreichen62 Byte-Adressraumbegrenzung.

Und dann gibt es verteilter gemeinsamer Speicher ", wo die (physisch getrennten) Speicher als ein (logisch gemeinsam genutzter) Adressraum adressiert werden können ".

17
Jerry101

Ist es vernünftig anzunehmen, dass jede physikalische Größe durch eine 64-Bit-Ganzzahl ohne Überlauf oder Unterlauf dargestellt werden kann?

Nicht genau. Es gibt viele Zahlen, die sowohl größer als auch kleiner sind, weshalb wir Gleitkommazahlen haben. Gleitkommazahlen tauschen weniger Präzision gegen bessere Reichweite aus.

In dem von Ihnen zitierten Beispiel ist es sehr unwahrscheinlich, dass Sie jemals eine größere Zahl benötigen würden. 64 Bit entsprechen ungefähr 18 Billionen Elementen. Aber sag niemals nie.

10
Robert Harvey

Ihre Annahme behandelt keine physikalischen Größen, die nur durch Gleitkommazahlen dargestellt werden können. Und selbst wenn Sie sich entschieden haben, alle Zahlen zu skalieren, beispielsweise indem Sie alle Zahlen mit 10000 multiplizieren (die Werte sind also immer noch ganze Zahlen, können aber in Zehntausendstel dargestellt werden), schlägt dieses Schema für Zahlen nahe Null fehl, beispielsweise für die Elektronenmasse (9,1094 · 10³³ kg).

Das ist eine sehr reale (und extrem kleine) physikalische Größe , hier sind noch einige mehr Sie werden Probleme damit haben . Und wenn Sie argumentieren, dass dies keine reale physikalische Größe ist (obwohl sie in kg angegeben ist), sollten Sie Folgendes berücksichtigen:

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

Sie sehen also, wohin ich damit gehe. Der letzte, mit dem Sie auch nicht umgehen können.

Natürlich könnten Sie ein spezielles Feld innerhalb der Zahl haben, um einen ganzzahligen Teil um einen variablen Multiplikator nach oben oder unten zu skalieren. Nun, du hast gerade den Gleitkomma erfunden.

7
tcrosley

Zuerst würde ich die Frage beantworten, welche physikalischen Werte durch eine Ganzzahl dargestellt werden können/sollen?

Ganzzahl ist eine Darstellung einer natürlichen Zahl (und der Unterschiede zwischen ihnen) in einem Computersystem, daher ist es falsch, sie auf alles andere anzuwenden. Das Aufrufen von Entfernungen oder anderen Größen, die zur kontinuierlichen Domäne gehören, ist daher kein Argument. Für solche Größen gibt es reelle Zahlendarstellungen. Und Sie können immer eine beliebig große Einheit auswählen und jeden Wert mit einer bestimmten Genauigkeit anpassen.

Was sind also physikalische Werte, die natürliche Zahlen sind und die 64-Bit-Ganzzahlen überlaufen können?

Ich kann mir zwei vorstellen. Anzahl der physischen Objekte (wie Atome) und Energieniveaus, in denen sich ein Quantensystem befinden kann. Dies sind zwei Dinge, die streng ganzzahlig sind. Jetzt weiß ich, dass Sie ein Atom teilen können, aber es erzeugt immer noch eine ganzzahlige Menge und Sie können es nicht auf unbestimmte Zeit teilen. Beide können den 64-Bit-Bereich der vorzeichenlosen Ganzzahl leicht überschreiten. Die Anzahl der Atome ist höher und ein atom kann sich in mehr als einem Energiezustand befinden.

Ob Informationen physisch sind oder nicht, ist sehr umstritten. Ich würde sagen, dass es nicht so ist. Daher würde ich nicht sagen, dass die Menge an Informationen eine physische Sache ist. Also ist nicht die Menge von RAM oder so etwas. Wenn Sie dies zulassen würden, übersteigt die Anzahl der Atome leicht diese Anzahl, da Sie mehr als ein atom benötigen, um mit der heutigen Technologie ein Bit zu speichern.

5
luk32

Zusätzlich zur Antwort von Jerry101 möchte ich diesen sehr einfachen und praktischen Test auf Richtigkeit anbieten:

Angenommen, Sie weisen in einem 64-Bit-Betriebssystem über malloc Speicher zu. Angenommen, der Speicherzuweiser beschließt, Ihnen einen gültigen Speicherblock mit der von Ihnen angeforderten Größe zurückzugeben, wobei jedoch das 63. Bit gesetzt ist.

Mit anderen Worten, nehmen wir an, dass es einige Programmierumgebungen gibt, in denen 0xFFFFFFFFxxxxxxxx sind legitime Speicherbereiche, die von einem Aufruf von malloc zurückgegeben werden können.

Die Frage ist, ob Ihr Code weiterhin wie beabsichtigt funktioniert.

Wenn die analoge Situation bei 32-Bit-Betriebssystemen auftritt, funktionierte einige Software nicht ordnungsgemäß, wenn ihnen Speicheradressen "in der oberen Hälfte" zugewiesen wurden. Ursprünglich wurde angenommen, dass solche Speicheradressen nur für den privilegierten Code (Betriebssysteme, Gerätetreiber und Peripheriegeräte) verfügbar sind. Aufgrund der 32-Bit-Adressraumkrise entschieden sich die Betriebssystemanbieter jedoch, einen Teil dieses reservierten Speicherplatzes für verfügbar zu machen Anwendungen, die danach fragen.

Glücklicherweise ist es ziemlich unwahrscheinlich, dass diese Situation für 64-Bit-Programme für eine Weile auftritt, zumindest nicht in einem Jahrzehnt.

Wenn diese Situation schließlich eintritt, bedeutet dies, dass 128-Bit-adressierbare Prozessoren und Betriebssysteme zu diesem Zeitpunkt zum Mainstream geworden wären und dass sie eine "64-Bit-Emulationsumgebung" bereitstellen könnten, um den Betrieb dieser "Legacy-Anwendungen" zu ermöglichen unter ähnlichen Annahmen wie die heutigen 64-Bit-Betriebssysteme.

Beachten Sie schließlich, dass sich diese Diskussion nur auf Speicheradressen konzentriert. Ein ähnliches Problem mit Zeitstempeln muss mit größerer Vorsicht behandelt werden, da bestimmte Zeitstempelformate den Mikrosekunden eine Menge Genauigkeit zuweisen und daher weniger Bits zur Verfügung stehen, um die Zeit in der Zukunft darzustellen. Diese Probleme sind im Wikipedia-Artikel über Problem des Jahres 2038 zusammengefasst.

4
rwong

Dies ist eine Frage, die Sie von Fall zu Fall stellen müssen. Sie sollten nicht verwenden eine allgemeine Annahme, dass die 64-Bit-Arithmetik nicht überläuft, denn selbst wenn die korrekten Mengen in einem viel kleineren Bereich liegen, kann eine böswillige Datenquelle zu unangemessenen Mengen führen Überlauf, und es ist besser, auf diese Situation vorbereitet zu sein, als unerwartet davon getroffen zu werden.

In einigen Fällen ist es sinnvoll, Code zu schreiben, der vom Nichtüberlauf von 64-Bit-Zahlen abhängt. Die Hauptklasse des mir bekannten Beispiels sind Zähler, bei denen der Zähler jedes Mal erhöht wird, wenn er verwendet wird. Selbst bei einer Geschwindigkeit von einem Inkrement pro Nanosekunde (nicht praktikabel) würde der Überlauf mehr als ein Jahrhundert dauern.

Beachten Sie, dass es auf den ersten Blick "im Prinzip immer falsch" zu sein scheint, sich für die Richtigkeit eines Systems auf "Zeit bis zum Ausfall" zu verlassen, dies jedoch ständig mit Authentifizierung/Anmeldung. Bei genügend Zeit (für Brute Forcing) ist ein solches System (ob basierend auf Passwörtern, privaten Schlüsseln, Sitzungstoken usw.) defekt.

Ist es MÖGLICH, dass eine physikalische Größe nicht in 64 Bit passt? Na sicher. Andere haben darauf hingewiesen, die Anzahl der Atome in der Sonne oder die Anzahl der Millimeter bis zur nächsten Galaxie zu zählen. Ob solche Fälle für Ihre Bewerbung relevant sind, hängt von Ihrer Bewerbung ab. Wenn Sie die Anzahl der Artikel in einem bestimmten Behälter in Ihrem Lager zählen, sind wahrscheinlich 16 Bit ausreichend. Wenn Sie Statistiken über die Anzahl der Menschen auf der Welt erstellen, die verschiedene Bedingungen erfüllen, müssen Sie in der Lage sein, Milliarden aufzuzeichnen. Sie benötigen also mehr als 32 Bit. Zu diesem Zeitpunkt würden Sie vermutlich auf 64 (als wenige Computer) umsteigen integrierte Unterstützung für 37-Bit-Nummern usw.). Wenn dies eine chemische Anwendung ist, bei der Atome im Wert von Mol gezählt werden, reichen 64 Bit nicht aus.

Nur weil heutzutage kein Computer über 2 ^ 64 Byte Speicher verfügt, bedeutet dies technisch gesehen nicht unbedingt, dass ein Array-Index niemals mehr als 2 ^ 64 sein kann. Es gibt ein Konzept, das als "spärliches Array" bezeichnet wird, bei dem viele der Elemente des Arrays nirgendwo physisch gespeichert sind und für solche nicht gespeicherten Werte ein Standardwert wie null oder null angenommen wird. Aber ich nehme an, wenn Sie eine Funktion zum Durchsuchen eines Arrays oder einer Liste schreiben und die Größe des Feldes, in dem Sie den Index im Array halten, mehr als doppelt so groß ist wie die größtmögliche Adresse, und dann auf Überlauf prüfen, wenn Das Hinzufügen von zwei Indizes wäre nicht unbedingt erforderlich.

2
Jay

Es ist unangemessen anzunehmen, dass eine 64-Bit-Ganzzahl alle Zahlen enthalten kann. Mehrere Gründe:

  1. Die maximale und minimale 64-Bit-Ganzzahl sind endliche Zahlen. Für jede endliche Zahl existiert eine größere und kleinere endliche Zahl.

  2. Berechnungen mit 128-Bit- und 256-Bit-Zahlen werden derzeit an verschiedenen Stellen verwendet. Viele Prozessoren verfügen über spezifische Anweisungen, die mit 128-Bit-Ganzzahlen arbeiten.

  3. Vor 20 Jahren wurde eine 1-GB-Festplatte als "groß" eingestuft. Heute wird eine 1 TB Festplatte als klein angesehen. Vor 20 Jahren hatten durchschnittliche Desktops etwa 16 MB RAM. Mein aktueller Desktop verfügt über mehr als 16 GB RAM. Der Festplattenspeicher und RAM sind in der Vergangenheit exponentiell gewachsen und werden in Zukunft voraussichtlich exponentiell wachsen. Wenn nicht jemand einen sehr guten Grund finden kann, warum es aufhören sollte zu wachsen, ist es nicht sinnvoll anzunehmen, dass es aufhören wird.

0
Peter