Wird dies durch die Sprache definiert? Gibt es ein definiertes Maximum? Ist es in verschiedenen Browsern unterschiedlich?
javascript
math
browser
cross-browser
TALlama
quelle
quelle
1n << 10000n
ist eine wirklich, wirklich große Ganzzahl, ohne an Genauigkeit zu verlieren, ohne Abhängigkeiten zu erfordern (und natürlich nicht einmal nahe an einer Grenze).Antworten:
JavaScript hat zwei Nummerntypen:
Number
undBigInt
.Der am häufigsten verwendete Nummerntyp
Number
ist eine 64-Bit-Gleitkomma- IEEE 754- Nummer.Der größte exakte Integralwert dieses Typs
Number.MAX_SAFE_INTEGER
ist:Um dies ins rechte Licht zu rücken: Eine Billiarde Bytes ist ein Petabyte (oder eintausend Terabyte).
"Sicher" bezieht sich in diesem Zusammenhang auf die Fähigkeit, Ganzzahlen genau darzustellen und korrekt zu vergleichen.
Aus der Spezifikation:
Um sicher größere Zahlen als diese zu verwenden, müssen Sie verwenden
BigInt
, die keine Obergrenze haben.Beachten Sie, dass die bitweisen Operatoren und Shift-Operatoren mit 32-Bit-Ganzzahlen arbeiten. In diesem Fall beträgt die maximale sichere Ganzzahl 2 31 -1 oder 2.147.483.647.
Technischer Hinweis zum Thema mit der Nummer 9.007.199.254.740.992: Es gibt eine genaue IEEE-754-Darstellung dieses Werts, und Sie können diesen Wert einer Variablen zuweisen und aus dieser lesen, also für sehr sorgfältig ausgewählte Anwendungen im Bereich von ganzen Zahlen kleiner oder gleich Mit diesem Wert können Sie dies als Maximalwert behandeln.
Im allgemeinen Fall müssen Sie diesen IEEE-754-Wert als ungenau behandeln, da nicht eindeutig ist, ob er den logischen Wert 9.007.199.254.740.992 oder 9.007.199.254.740.993 codiert.
quelle
4294967295 === Math.pow(2,32) - 1;
> = ES6:
<= ES5
Aus der Referenz :
Code-Snippet anzeigen
quelle
Number.MIN_VALUE
die kleinstmögliche positive Zahl ist. Der kleinste Wert (dh weniger als alles andere) ist wahrscheinlich-Number.MAX_VALUE
.Number.MIN_SAFE_INTEGER
undNumber.MAX_SAFE_INTEGER
Es ist 2 53 == 9 007 199 254 740 992. Dies liegt daran, dass
Number
s als Gleitkomma in einer 52-Bit-Mantisse gespeichert sind.Der Mindestwert beträgt -2 53 .
Dies macht einige lustige Dinge passieren
Und kann auch gefährlich sein :)
Weiterführende Literatur: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
quelle
i += 1000000000
In JavaScript gibt es eine Nummer namens
Infinity
.Beispiele:
Dies kann für einige Fragen zu diesem Thema ausreichend sein.
quelle
min
Variable zu initialisieren , wenn Sie nach einem Mindestwert suchen.Infinity - 1 === Infinity
1 - Infinity === -Infinity
Jimmys Antwort repräsentiert das kontinuierliche JavaScript-Ganzzahlspektrum korrekt als -9007199254740992 bis einschließlich 9007199254740992 (sorry 9007199254740993, Sie könnten denken, Sie sind 9007199254740993, aber Sie liegen falsch! Demonstration unten oder in jsfiddle ).
Es gibt jedoch keine Antwort, die dies programmatisch findet / beweist (außer der, auf die CoolAJ86 in seiner Antwort anspielte , die in 28,56 Jahren abgeschlossen sein würde;). Daher gibt es hier eine etwas effizientere Möglichkeit, dies zu tun (um genau zu sein, es ist effizienter von etwa 28,559999999968312 Jahren :), zusammen mit einer Test Geige :
quelle
x++
gibt Ihnen den Wert von x, bevor das Inkrement aufgetreten ist, was wahrscheinlich die Diskrepanz erklärt. Wenn der Ausdruck den gleichen Wert wie der Endwert von x haben soll, sollten Sie ihn in ändern++x
.Sicher sein
Argumentation
Ich dachte, ich wäre schlau und würde den Wert
x + 1 === x
mit einem pragmatischeren Ansatz finden.Meine Maschine kann nur ungefähr 10 Millionen pro Sekunde zählen ... also werde ich in 28,56 Jahren mit der endgültigen Antwort zurückschicken.
Wenn Sie nicht so lange warten können, bin ich bereit, darauf zu wetten
9007199254740992 === Math.pow(2, 53) + 1
ist Beweis genug4294967295
dieMath.pow(2,32) - 1
zu vermeiden erwarteten Probleme mit BitverschiebungFinden
x + 1 === x
:quelle
Die kurze Antwort lautet: "Es kommt darauf an."
Wenn Sie irgendwo bitweise Operatoren verwenden (oder wenn Sie sich auf die Länge eines Arrays beziehen), sind die Bereiche:
Ohne Vorzeichen:
0…(-1>>>0)
Unterzeichnet:
(-(-1>>>1)-1)…(-1>>>1)
(Es kommt also vor, dass die bitweisen Operatoren und die maximale Länge eines Arrays auf 32-Bit-Ganzzahlen beschränkt sind.)
Wenn Sie keine bitweisen Operatoren verwenden oder mit Array-Längen arbeiten:
Unterzeichnet:
(-Math.pow(2,53))…(+Math.pow(2,53))
Diese Einschränkungen werden durch die interne Darstellung des Typs "Zahl" auferlegt, die im Allgemeinen der Gleitkomma-Darstellung mit doppelter Genauigkeit nach IEEE 754 entspricht. (Beachten Sie, dass im Gegensatz zu typischen vorzeichenbehafteten Ganzzahlen die Größe der negativen Grenze aufgrund der Eigenschaften der internen Darstellung, die tatsächlich eine negative 0 enthält, dieselbe ist wie die Größe der positiven Grenze !)
quelle
ECMAScript 6:
quelle
MAX_SAFE_INTEGER
in allen Browsern rückwärts zu rechnen ? Sollten Sie stattdessen vorwärts gehen? Dh Number.MAX_SAFE_INTEGER = 2 * (Math.pow (2, 52) - 1) + 1;Math.pow(2, 53)-1
eine sichere Operation? Es ist eine größere als die größte sichere Ganzzahl.Viele Antworten aus früheren Zeiten haben das Ergebnis zeigen ,
true
der9007199254740992 === 9007199254740992 + 1
zu verifizieren , dass 9 007 199 254 740 991 die maximale und sichere ganze Zahl ist.Was ist, wenn wir weiter akkumulieren:
Wir konnten feststellen, dass unter den Zahlen von mehr als 9 007 199 254 740 992 , nur gerade Zahlen sind darstellbar .
Es ist ein Eingang, um zu erklären, wie das 64-Bit-Binärformat mit doppelter Genauigkeit dabei funktioniert. Mal sehen, wie 9 007 199 254 740 992 unter Verwendung dieses Binärformats gehalten (dargestellt) werden.
Verwenden Sie eine kurze Version, um dies anhand von 4 503 599 627 370 496 zu demonstrieren :
Auf der linken Seite des Pfeils haben wir den Bitwert 1 und einen benachbarten Radixpunkt. Durch Multiplizieren
2^52
bewegen wir den Radixpunkt 52 Schritte nach rechts und er geht bis zum Ende. Jetzt erhalten wir 4503599627370496 in binärer Form.Jetzt beginnen wir, 1 auf diesen Wert zu akkumulieren, bis alle Bits auf 1 gesetzt sind, was 9 007 199 254 740 991 in Dezimalzahl entspricht.
Da im 64-Bit-Binärformat mit doppelter Genauigkeit ausschließlich 52 Bit für den Bruch zugewiesen werden, steht kein Bit mehr zum Hinzufügen einer weiteren 1 zur Verfügung. Wir können also alle Bits auf 0 und zurücksetzen manipuliere den Exponententeil:
Jetzt bekommen wir die 9 007 199 254 740 992 , und mit der Nummer größer ist als es, was das Format halten könnte , ist 2 mal die Fraktion , bedeutet dies nun all 1 zusätzlich auf dem Bruchteil entspricht tatsächlich bis 2 hinaus, das ist , warum Doppel -präzises 64-Bit-Binärformat kann keine ungeraden Zahlen enthalten, wenn die Zahl größer als 9 007 199 254 740 992 ist :
Wenn also die Zahl größer als 9 007 199 254 740 992 * 2 = 18 014 398 509 481 984 wird, kann nur das 4-fache der Fraktion gehalten werden:
Wie wäre es mit einer Zahl zwischen [ 2 251 799 813 685 248 , 4 503 599 627 370 496 )?
Der Bitwert 1 nach dem Radixpunkt ist genau 2 ^ -1. (= 1/2 , = 0,5) Wenn also die Zahl kleiner als 4 503 599 627 370 496 (2 ^ 52) ist, steht ein Bit zur Verfügung, um das 1/2-fache der Ganzzahl darzustellen :
Weniger als 2 251 799 813 685 248 (2 ^ 51)
Und was ist der verfügbare Bereich des Exponententeils ? Das Format weist 11 Bits dafür zu. Vollständiges Format aus dem Wiki : (Weitere Details finden Sie dort)
Damit der Exponententeil 2 ^ 52 ist, müssen wir genau e = 1075 setzen.
quelle
Andere haben die generische Antwort vielleicht bereits gegeben, aber ich dachte, es wäre eine gute Idee, sie schnell zu bestimmen:
Das gibt mir 9007199254740992 innerhalb von weniger als einer Millisekunde in Chrome 30.
Es werden Potenzen von 2 getestet, um herauszufinden, welche, wenn '1 hinzugefügt' wird, sich selbst entspricht.
quelle
Alles, was Sie für bitweise Operationen verwenden möchten, muss zwischen 0x80000000 (-2147483648 oder -2 ^ 31) und 0x7fffffff (2147483647 oder 2 ^ 31 - 1) liegen.
Die Konsole zeigt an, dass 0x80000000 gleich +2147483648 ist, 0x80000000 & 0x80000000 jedoch -2147483648.
quelle
Versuchen:
In Firefox 3.6 ist es 2 ^ 31 - 1.
quelle
^
bedeutet zur Macht erhoben . In der Javascript-Konsole^
ist XOR nicht auf101
und 2 ist010
. Nun, wenn Sie Bitwise XOR sie, werden Sie lesen, wenn Sie verwirrt5(101) ^ 2(010) = 7(111)
sind. Was hier diskutiert wird, istMath.pow()
nicht der^
OperatorZum Zeitpunkt des Schreibens erhält JavaScript einen neuen Datentyp :
BigInt
. Es handelt sich um einen TC39-Vorschlag in Phase 4 , der in EcmaScript 2020 aufgenommen werden soll .BigInt
ist in Chrome 67+, FireFox 68+, Opera 54 und Node 10.4.0 verfügbar. Es ist in Safari et al. Im Gange ... Es führt numerische Literale mit dem Suffix "n" ein und ermöglicht eine beliebige Genauigkeit:Die Präzision geht natürlich immer noch verloren, wenn eine solche Nummer (möglicherweise unbeabsichtigt) zu einem Nummer-Datentyp gezwungen wird.
Und natürlich wird es aufgrund des endlichen Speichers immer zeitliche Einschränkungen und zeitliche Kosten geben, um den erforderlichen Speicher zuzuweisen und mit so großen Zahlen zu rechnen.
Zum Beispiel wird die Erzeugung einer Zahl mit hunderttausend Dezimalstellen eine merkliche Verzögerung dauern, bis sie abgeschlossen ist:
...Aber es funktioniert.
quelle
Ich habe einen einfachen Test mit der Formel X- (X + 1) = -1 durchgeführt, und der größte Wert von XI, der für Safari, Opera und Firefox (getestet unter OS X) verwendet werden kann, ist 9e15. Hier ist der Code, den ich zum Testen verwendet habe:
quelle
9000000000000000
gibt es 1 signifikante Zahl. in `9007199254740992` gibt es 15 signifikante Zahlen.9000000000000000
wie es ist - hat1
SF. wo90*10^14
hat 2. ( sigfigscalculator.appspot.com ) & mathsfirst.massey.ac.nz/Algebra/Decimals/SigFig.htm (unterer Abschnitt)Ich schreibe es so:
Gleiches gilt für int32
quelle
Kommen wir zu den Quellen
Beschreibung
Browser-Kompatibilität
quelle
Im in Google Chrome integrierten Javascript können Sie ungefähr 2 ^ 1024 aufrufen, bevor die Zahl als unendlich bezeichnet wird.
quelle
In JavaScript ist die Darstellung von Zahlen
2^53 - 1
.Jedoch ,
Bitwise operation
berechnet auf32 bits ( 4 bytes )
, was bedeutet , wenn Sie 32 - Bit - Verschiebungen überschreiten werden Sie verlieren Bits beginnen.quelle
Scato wrotes:
Hex-Dezimalstellen sind vorzeichenlose positive Werte, also 0x80000000 = 2147483648 - das ist mathematisch korrekt. Wenn Sie einen vorzeichenbehafteten Wert festlegen möchten, müssen Sie nach rechts verschieben: 0x80000000 >> 0 = -2147483648. Sie können stattdessen auch 1 << 31 schreiben.
quelle
Firefox 3 scheint mit großen Zahlen kein Problem zu haben.
1e + 200 * 1e + 100 berechnet eine Geldstrafe von 1e + 300.
Safari scheint auch damit kein Problem zu haben. (Für die Aufzeichnung ist dies auf einem Mac, wenn jemand anderes beschließt, dies zu testen.)
Wenn ich zu dieser Tageszeit nicht mein Gehirn verloren habe, ist dies viel größer als eine 64-Bit-Ganzzahl.
quelle
100000000000000010 - 1 => 100000000000000020
Node.js und Google Chrome scheinen beide 1024-Bit-Gleitkommawerte zu verwenden, also:
quelle
2^53
wird als bezeichnet,MAX_SAFE_INT
weil über diesem Punkt die Werte zu Näherungswerten werden, genauso wie Brüche.