it-swarm.com.de

Warum 1.000.000.000 als 1000 * 1000 * 1000 in C schreiben?

Im von Apple erstellten Code gibt es folgende Zeile:

CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )

Gibt es einen Grund, 1,000,000,000 als 1000*1000*1000 auszudrücken?

Warum nicht 1000^3 für diese Angelegenheit?

133
SpaceDog

Ein Grund für die Multiplikation von Konstanten ist die Verbesserung der Lesbarkeit, während die Laufzeitleistung nicht beeinträchtigt wird. Auch, um anzuzeigen, dass der Schreiber in multiplikativer Weise über die Zahl nachgedacht hat. 

Bedenken Sie:

double memoryBytes = 1024 * 1024 * 1024;

Es ist eindeutig besser als:

double memoryBytes = 1073741824;

letzteres sieht auf den ersten Blick nicht die dritte Potenz von 1024 aus. 

Wie von Amin Negm-Awad erwähnt, ist der ^-Operator die binäre XOR. Vielen Sprachen fehlt der eingebaute Exponentiation-Operator zur Kompilierzeit, daher die Multiplikation.

193
Piotr Falkowski

Warum nicht 1000^3?

Das Ergebnis von 1000^3 ist 1003. ^ ist der Bit-XOR-Operator.

Auch wenn es nicht um das Q geht, füge ich eine Klarstellung hinzu. x^y führt nicht immer zu x+y aus, wie im Beispiel des Fragestellers. Sie müssen jedes Bit xor. Im Falle des Beispiels:

1111101000₂ (1000₁₀)
0000000011₂ (3₁₀)
1111101011₂ (1003₁₀)

Aber

1111101001₂ (1001₁₀)
0000000011₂ (3₁₀)
1111101010₂ (1002₁₀)
72
Amin Negm-Awad

Es gibt Gründe nicht , um 1000 * 1000 * 1000 zu verwenden.

Mit 16-Bit int läuft 1000 * 1000 über. Die Verwendung von 1000 * 1000 * 1000 verringert die Portabilität. 

Bei 32-Bit int laufen die folgenden Überläufe ab.

long long Duration = 1000 * 1000 * 1000 * 1000;  // overflow
long long Duration = 1000000000000;  // no overflow, hard to read

Schlagen Sie vor, dass der Lead-Wert dem Zieltyp hinsichtlich Lesbarkeit, Portabilität und Korrektheit entspricht.

double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;

Die e-Notation könnte auch einfach für Werte verwendet werden, die genau als double darstellbar sind. Dies führt natürlich dazu, zu wissen, ob double den ganzen Zahlenwert genau darstellen kann - was bei Werten über 1e9 von Bedeutung ist. (Siehe DBL_EPSILON und DBL_Dig).

long Duration = 1000000000;
// vs.
long Duration = 1e9;
63
chux

Zur besseren Lesbarkeit. 

Platzieren Sie Kommas und Leerzeichen zwischen den Nullen (1 000 000 000 oder 1,000,000,000), wird ein Syntaxfehler erzeugt. Wenn Sie 1000000000 im Code verwenden, ist es schwierig, genau zu sehen, wie viele Nullen vorhanden sind. 

1000*1000*1000 macht deutlich, dass es 10 ^ 9 ist, weil unsere Augen die Brocken leichter verarbeiten können. Es gibt auch keine Laufzeitkosten, da der Compiler sie durch die Konstante 1000000000 ersetzt. 

50
Tamás Zahola

Zur besseren Lesbarkeit. Zum Vergleich: Java unterstützt _ in Zahlen, um die Lesbarkeit zu verbessern (zuerst von Stephen Colebourne als Antwort auf Derek Fosters PROPOSAL: Binary Literals für Project Coin/JSR 334 vorgeschlagen). Man würde hier 1_000_000_000 schreiben.

In ungefähr chronologischer Reihenfolge von der ältesten Unterstützung bis zur neuesten:

Es ist eine relativ neue Funktion für Sprachen, um zu erkennen, dass sie unterstützen sollten (und dann gibt es noch Perl). Wie in der exzellenten Antwort von chux @, ist 1000*1000... eine Teillösung, öffnet dem Programmierer jedoch Fehler, die die Multiplikation überlaufen lassen, selbst wenn das Endergebnis ein großer Typ ist.

25
djechlin

Vielleicht einfacher zu lesen und einige Assoziationen mit dem 1,000,000,000-Formular zu erhalten. 

Ich denke, aus technischer Sicht gibt es keinen Unterschied zwischen der direkten Zahl oder der Multiplikation. Der Compiler generiert es trotzdem als konstante Milliardenzahl.

Wenn Sie über Objective-c sprechen, wird 1000^3 nicht funktionieren, da es keine solche Syntax für pow gibt (es ist xor). Stattdessen kann die Funktion pow() verwendet werden. In diesem Fall ist es jedoch nicht optimal. Es wird ein Laufzeitfunktionsaufruf und keine vom Compiler generierte Konstante angezeigt.

6
Madars Vi

Um die Gründe zu veranschaulichen, betrachten Sie folgendes Testprogramm:

$ cat comma-expr.c && gcc -o comma-expr comma-expr.c && ./comma-expr
#include <stdio.h>

#define BILLION1 (1,000,000,000)
#define BILLION2 (1000^3)

int main()
{
        printf("%d, %d\n", BILLION1, BILLION2);
}
0, 1003
$
2

Eine andere Möglichkeit, einen ähnlichen Effekt in C für Dezimalzahlen zu erzielen, ist die Verwendung der wörtlichen Gleitkomma-Notation - solange ein Double die gewünschte Zahl ohne Genauigkeitsverlust darstellen kann. 

IEEE 754 64-Bit Double kann problemlos jede nicht negative ganze Zahl <= 2 ^ 53 darstellen. In der Regel können lange Doppelbits (80 oder 128 Bit) noch weiter gehen. Die Konvertierungen werden zur Kompilierzeit ausgeführt. Es gibt also keinen Laufzeit-Overhead und Sie erhalten wahrscheinlich Warnungen, wenn unerwartete Genauigkeitsverluste auftreten und Sie einen guten Compiler haben.

long lots_of_secs = 1e9;
0
jschultz410