Pourquoi écrire que 1 000 000 000 d'1000*1000*1000 en C?
Dans le code créé par Apple, il y a cette ligne:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Est-il une raison à exprimer 1,000,000,000
comme 1000*1000*1000
?
Pourquoi ne pas 1000^3
pour que la matière?
- La clarté et la lisibilité du code. Vous ne pouvez pas le mettre , ou " comme séparateurs dans C, de sorte que la prochaine meilleure chose, c'est le calcul de la valeur à partir d'une multiplication. ^ est un autre opérateur en C - OU-exclusif.
- il est surtout utilisé pour des durées comme : 2*60*60 .. c'est facile de remarquer que est de 2 heures..
- Pour celui que je soupçonne 1,000,000,000 n'est pas valide la syntaxe
- Même s'il était valide la syntaxe, de la syntaxe doivent être localisées. Dans de grandes parties du monde", " est la marque décimale.
- Par la voie, de langages de programmation modernes ont autre façon d'écrire la même chose, par exemple dans Swift
1_000_000_000
. Cependant, avec des constantes de temps c'est plus difficile. C'est plus lisible d'écrire30 * 60
(30 minutes en secondes) que de l'écrire1800
. Il ya effectivement des langues qui va vous permettre d'écrire des unités, par exemplemeters
, vous permettant de vous protéger contre les mauvaises affectations. - Un plus léger avantage de 1000*1000*1000 plus de 1000^3 (si l'alimentation de l'opérateur existe dans la langue), c'est qu'il est plus facile de voir l'ordre de grandeur rapidement.
- Pour la même raison
1.0f / 255
est plus lisible que0.0039215689f
. Voir ce post. - Aussi, comme une note de côté, si il y en a de beaucoup de travail avec les unités physiques, regardez pour les bibliothèques qui fournissent des classes pour les unités d'écrire, par exemple,
1000 * Kilometers
ou15_min
. ^
est un XOR, pas un exposant ou de la puissance de l'opérateur.- Voir ce commentaire.
- En C++,
1,000,000,000
est une erreur de syntaxe, et evalues pour0
. - comme pour moi, il est plus à l'aise de voir que 1e9 1000*1000*1000 🙂
- Êtes-vous demander à propos de C ou Objective-C?
- bien, mais ce serait un
double
littérale, pas unint
. - euh...de sorte que vous pouvez le convertir en int en place si vous avez besoin d' 🙂
(1,000,000,000) == 0
- C++ prend désormais en charge
1'000'000
! - - Vous déjà entendu parler de l'erreur d'arrondi?
- Lèche C spécifie le minimum de précision et une gamme de
double
. Ledouble
de @kot331107,1e9
, est dans la gamme et exactement représentable comme undouble
, donc pas d'erreur d'arrondi se produit lors de la conversion de 32(plus) bits entier. Les plus grandes valeurs peuvent avoir arrondi. - FWIW, La gcc préprocesseur va accepter
#define BILLION 1000 ## 000 ## 000
, si le compilateur n'accepte pas1000 ## 000 ## 000
comme un littéral. Vous ne savez pas si cela s'applique à objective-c ou pas. - Double Possible de Représentant des grands nombres dans le code source, pour des raisons de lisibilité?
- connexes: Pourquoi le C analyseur de ne pas autoriser les espaces entre les chiffres d'un entier littéral?, Pourquoi le caractère espace n'a pas choisie pour C++14 chiffres de séparateurs?
- erreur d'arrondi avec (int)1e9 ?
- Peut-être pas pour cette valeur, mais si vous avez utilise habituellement le régime, vous obtiendrez peu.
- D'accord, mais cette certaine valeur 1e9.
Vous devez vous connecter pour publier un commentaire.
Une raison pour déclarer des constantes multiplicatives façon est d'améliorer la lisibilité, pendant le temps de la performance n'est pas affectée.
Aussi, pour indiquer que l'auteur a été pensée de manière multiplicative sur le nombre.
Considérez ceci:
C'est clairement mieux que:
que ce dernier ne semble pas, au premier coup d'œil, le troisième bloc de 1024.
Comme Amin Negm-Awad mentionné, la
^
l'opérateur est le binaireXOR
. De nombreuses langues manque intégré, au moment de la compilation opérateur exponentiel, d'où la multiplication.x
pour obtenir la taille de la sous-intervalle... et tout à coup vous avez une fraction d'octets, ce qui peut nécessiter de la logique supplémentaire pour compenser.Le résultat de
1000^3
est 1003.^
est le bit-opérateur XOR.Même qu'elle ne traite pas avec le Q, j'ai ajouter une précision.
x^y
ne pas toujours évaluer àx+y
comme il le fait dans la interlocuteur de l'exemple. Vous devez xor chaque bit. Dans le cas de l'exemple:Mais
^
opérateur XOR en C/C++/Objective-C etc. Dans les calculateurs, cela signifie généralement des x-de-la-y de pouvoir.Il y a des raisons pas à utiliser
1000 * 1000 * 1000
.Avec 16 bits
int
,1000 * 1000
les débordements. Donc, en utilisant1000 * 1000 * 1000
réduit la portabilité.Avec 32-bit
int
, à la suite de débordements.Suggèrent que la valeur correspond au type de la destination pour des raisons de lisibilité, la portabilité et exactitude.
Pourrait également simple d'utilisation
e
notation pour les valeurs qui sont exactement représentable comme undouble
. Bien sûr, cela conduit à savoir sidouble
peut représenter avec exactitude la valeur de nombre entier - quelque chose de préoccupation avec des valeurs supérieures à 1e9. (VoirDBL_EPSILON
etDBL_DIG
).double
peut exactement représenter tous les entiers jusqu'à 2^53 ≈ 9e15.double
utilisation de binary64, même si elle est très couramment utilisée. Par le C spec, des valeurs jusqu'à 1e9 sont exactement représentable. Cela dépend de si vous voulez le code de spécification ou de s'appuyer sur des pratiques communes.1000
et1000000000000
sont les constantes entières. Chacun de façon indépendante avec le type sélectionné à partir deint
,long
oulong long
. Le compilateur utilise le premier type de ces 3, dans lequel le constante entière s'adapte.1000 * 1000 * 1000 * 1000
est fait avecint
mathématiques comme chaque1000
dans unint
. Le produit déborde de 32 bitsint
.1000000000000
est certainement représentable comme unlong long
(ou peut-être plus étroite) - pas de débordement. Le type de la ciblelong long Duration
n'affecte pas ce "côté droit de l' =" detemrination.int
,long x = 1000 * 1000 * 1000L;
serait de débordement, tout enlong x = 1000L * 1000 * 1000;
ne le serait pas.Pour des raisons de lisibilité.
Placer les virgules et des espaces entre les zéros (
1 000 000 000
ou1,000,000,000
) produirait une erreur de syntaxe, et d'avoir1000000000
dans le code, ce qui rend difficile de voir exactement combien de zéros sont là.1000*1000*1000
il ressort que c'est 10^9, parce que nos yeux peuvent traiter les morceaux plus facilement. Aussi, il n'y a pas d'exécution de coût, parce que le compilateur remplacera avec la constante1000000000
.1,000,000,000
ne produit pas d'erreur de syntaxe, il serait juste de dire autre chose. Par exempleCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
comme séparateur, trop 🙂'
séparateur, en C++14, de sorte que vous pouvez utiliser1'000'000'000
. (Il a été choisi parce que1,000,000,000
pourrait être interprété à tort comme l'opérateur virgule ou 4 paramètres distincts, et_1_000_000_000
est valide (mais probablement mauvais) nom de la variable.)Pour des raisons de lisibilité. Pour comparaison, Java prend en charge
_
en nombre afin d'améliorer la lisibilité (d'abord proposée par Stephen Colebourne comme un répondre à Derek Foster PROPOSITION: Binaire Littéraux pour Projet de Pièce de monnaie/JSR 334) . On pourrait écrire1_000_000_000
ici.À peu près dans l'ordre chronologique, de la plus ancienne de soutien à la plus récente:
"(1)1111 1111"
(apparemment pas pour les valeurs décimales, uniquement pour les chaînes de bits représentant binaire, quartal, octal ou hexadécimal valeurs)1$000$000
1_000_000_000
1'000'000'000
C'est un élément relativement nouveau pour les langues à réaliser qu'ils doivent appuyer (et puis il y a Perl). Comme dans chux@'s réponse excellent,
1000*1000...
est une solution partielle, mais qui ouvre le programmeur à des bugs de débordement de la multiplication, même si le résultat final est un grand type.1'000000'000
. Je trouve ça très pratique pour les constantes de l'écriture en binaire:0b11'10'01'00
ou quelque chose pour un échange ou d'un mélange de contrôle arg à une valeur intrinsèque.1000000000
ou1000*1000*1000
est l'équivalent en C, nécessitant l'identique de la compilation dépassement de temps de diagnostic, le cas échéant (une valeur dans le type du représentable valeurs est une compilation contrainte de temps pour les constantes ainsi que pour les expressions constantes).Qui pourrait être plus simple à lire et à obtenir certaines associations avec la
1,000,000,000
forme.De l'aspect technique je suppose qu'il n'y a pas de différence entre le nombre direct ou de multiplication. Le compilateur va générer constante milliards de numéro de toute façon.
Si vous parlez d'objective-c, puis
1000^3
ne fonctionne pas car il n'existe pas de syntaxe pour pow (il est xor). Au lieu de cela,pow()
fonction peut être utilisée. Mais dans ce cas, il ne sera pas optimal, il sera à l'exécution de l'appel de fonction pas un, généré par le compilateur constante.Pour illustrer les raisons de considérer le programme de test suivant:
Une autre façon d'obtenir un effet similaire en C pour des nombres décimaux est d'utiliser littérale à virgule flottante notation-tant qu'un double peut représenter le nombre que vous voulez sans aucune perte de précision.
IEEE 754 double de 64 bits peut représenter n'importe quel nombre entier non négatif <= 2^53, sans problème. Généralement, long double (80 ou 128 bits) peut aller encore plus loin. Les conversions sera fait au moment de la compilation, il n'y a pas de gestion d'exécution et vous aurez probablement obtenir des avertissements si il y a une perte soudaine de la précision et vous avez un bon compilateur.