Warum schreiben 1.000.000.000 als 1000 * 1000 * 1000 in C?
Im code von Apple erstellt, gibt es diese Zeile:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Gibt es irgendeinen Grund express 1,000,000,000
als 1000*1000*1000
?
Warum nicht 1000^3
für diese Angelegenheit?
InformationsquelleAutor der Frage SpaceDog | 2016-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Grund zum deklarieren von Konstanten in einer multiplikativen Weise ist, um die Lesbarkeit zu verbessern, während die Leistung ist nicht betroffen.
Auch, um zu zeigen, dass der Autor dachte, in einer multiplikativen Weise über die Anzahl.
Bedenken Sie:
Es ist deutlich besser als:
da letzteres sieht nicht auf den ersten Blick die Dritte Potenz von 1024.
Amin Negm-Awad erwähnt, die
^
Betreiber ist die binäreXOR
. Viele Sprachen fehlen die built-in -, compile-Zeit-Potenzierung-operator, also die Multiplikation.InformationsquelleAutor der Antwort Piotr Falkowski
Ergebnis
1000^3
ist 1003.^
ist die bit-XOR-operator.Gar nicht um die Q selbst, füge ich eine Klarstellung.
x^y
hat nicht immer bewerten zux+y
wie der Fragesteller die Beispiel. Sie haben, um jedes bit xor. Im Fall des Beispiels:Aber
InformationsquelleAutor der Antwort Amin Negm-Awad
Gibt es Gründe, die nicht Verwendung
1000 * 1000 * 1000
.Mit 16-bit -
int
1000 * 1000
überläuft. Also mit1000 * 1000 * 1000
reduziert Portabilität.Mit 32-bit -
int
folgende überläuft.Vermuten, dass die lead-Wert entspricht dem Ziel für eine bessere Lesbarkeit, Portierbarkeit und Richtigkeit.
Könnte auch einfach verwenden
e
notation für Werte, die genau darstellbar alsdouble
. Natürlich führt dies zu wissen, wenndouble
können Sie genau stellen die ganze Zahl mit dem Wert - etwas, das der Sorge um die Werte, die größer als 1e9. (SieheDBL_EPSILON
undDBL_DIG
).InformationsquelleAutor der Antwort chux
Zur besseren Lesbarkeit.
Platzierung von Kommas und Leerzeichen zwischen den Nullen (
1 000 000 000
oder1,000,000,000
) würde zu einem Syntaxfehler, und mit1000000000
im code macht es schwer zu sehen, genau wie viele Nullen sind da.1000*1000*1000
macht es offensichtlich, dass es 10^9, weil unsere Augen verarbeiten kann die Stücke einfach mehr. Auch gibt es keine runtime-Kosten, da der compiler ersetzen Sie es mit der ständigen1000000000
.InformationsquelleAutor der Antwort Tamás Zahola
Zur besseren Lesbarkeit. Zum Vergleich, die Java unterstützt
_
in zahlen um die Lesbarkeit zu verbessern (zuerst vorgeschlagen von Stephen Colebourne als Antwort auf Derek Foster ' s VORSCHLAG: Binär-Literale für Projekt-Münze/JSR 334) . Würde man schreiben1_000_000_000
hier.In grob chronologischer Reihenfolge, vom ältesten Unterstützung der neuesten:
"(1)1111 1111"
(anscheinend nicht für dezimal-Werte, nur für bitstrings darstellen binäre, quartal, oktal-oder hexadezimal-Werte)1$000$000
1_000_000_000
1'000'000'000
Es ist ein relativ neues feature für Sprachen zu realisieren, sollten Sie Unterstützung (und dann gibt es Perl). Wie in chux@'s ausgezeichnete Antwort,
1000*1000...
ist eine partielle Lösung, sondern öffnet die Programmierer bis zum Fehler aus, dass die Multiplikation auch wenn das endgültige Ergebnis ist ein großer Typ.InformationsquelleAutor der Antwort djechlin
Vielleicht einfacher zu Lesen und Holen Sie sich einige Vereine mit der
1,000,000,000
form.Vom technischen Aspekt, den ich denke, es gibt keinen Unterschied zwischen direkt-Zahl oder die Multiplikation. Der compiler generiert es als ständigen Milliarden-Nummer sowieso.
Wenn Sie sprechen über objective-c, dann
1000^3
wird nicht funktionieren, weil es keine solche syntax pow (es ist ein xor). Stattdessenpow()
- Funktion verwendet werden. Aber in diesem Fall, es ist nicht optimal, es wird eine runtime-Funktion aufrufen, nicht zu einem compiler-generierten Konstanten.InformationsquelleAutor der Antwort Madars Vi
Veranschaulichen die Gründe betrachten Sie das folgende test-Programm:
InformationsquelleAutor der Antwort Peter A. Schneider
Anderen Weg, einen ähnlichen Effekt zu erzielen (in C) für Dezimalzahlen ist die Verwendung von floating-point-literal-Schreibweise-so lange, wie ein double darstellen kann, die Zahl, die Sie wollen, ohne Verlust von Präzision.
IEEE-754 64-bit-double darstellen kann jede nicht-negative ganze Zahl <= 2^53 ohne problem. In der Regel, long double (80 oder 128 bit) können sogar noch weiter gehen als das. Die Umrechnungen erfolgt zur compile-Zeit, so gibt es keine Laufzeit-overhead, und Sie werden wahrscheinlich erhalten Warnungen, wenn es zu einem unerwarteten Verlust von Präzision und Sie haben einen guten compiler.
InformationsquelleAutor der Antwort jschultz410