Dans le code créé par Apple, il y a cette ligne:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Y a-t-il une raison d'exprimer 1,000,000,000
comme 1000*1000*1000
?
Pourquoi pas 1000^3
d'ailleurs?
objective-c
c
integer
literals
canard
la source
la source
1_000_000_000
. Cependant, avec les constantes de temps, c'est plus difficile. Il est plus lisible à écrire30 * 60
(30 minutes en secondes) qu'à écrire1800
. Il existe en fait des langages qui vous permettront d'écrire des unités, par exemplemeters
, vous permettant de vous protéger contre les mauvaises affectations.^
est un XOR, pas un exposant ou un opérateur puissant.Réponses:
L'une des raisons de déclarer des constantes de manière multiplicative est d'améliorer la lisibilité, tandis que les performances d'exécution ne sont pas affectées. Aussi, pour indiquer que l'écrivain pensait de manière multiplicative au nombre.
Considère ceci:
C'est clairement mieux que:
car ce dernier ne regarde pas, à première vue, la troisième puissance de 1024.
Comme l'a mentionné Amin Negm-Awad, l'
^
opérateur est le binaireXOR
. De nombreux langages ne disposent pas de l'opérateur d'exponentiation intégré à la compilation, d'où la multiplication.la source
x
pour obtenir la taille de la sous-plage ... et soudainement vous avez une fraction byte, qui peut nécessiter une logique supplémentaire pour compenser.Le résultat de
1000^3
est 1003.^
est l'opérateur bit-XOR.Même s'il ne traite pas du Q lui-même, j'ajoute une précision.
x^y
n'évalue pas toujoursx+y
comme dans l'exemple de l'interrogateur. Vous devez xor chaque bit. Dans le cas de l'exemple:Mais
la source
^
opérateur signifie XOR en C / C ++ / Objective-C etc. Dans les calculatrices, cela signifie généralement la puissance x-to-the-y.Il y a des raisons de ne pas utiliser
1000 * 1000 * 1000
.Avec 16 bits
int
,1000 * 1000
déborde. L'utilisation1000 * 1000 * 1000
réduit donc la portabilité.Avec 32 bits
int
, la première ligne de code suivante déborde.Suggérer que la valeur du prospect correspond au type de destination pour la lisibilité, la portabilité et l' exactitude.
Il pourrait également être simple d'utiliser la
e
notation pour les valeurs qui sont exactement représentables sous forme dedouble
. Bien sûr, cela conduit à savoir sidouble
peut représenter exactement la valeur du nombre entier - ce qui est préoccupant avec des valeurs supérieures à 1e9. (VoirDBL_EPSILON
etDBL_DIG
).la source
double
peut représenter exactement tous les nombres entiers jusqu'à 2 ^ 53 ≈ 9e15.double
utilisation de binary64, même s'il est très couramment utilisé. Selon la spécification C, les valeurs jusqu'à 1e9 environ sont exactement représentables. Cela dépend si vous souhaitez coder selon les spécifications ou vous fier aux pratiques courantes.1000
et1000000000000
sont des constantes entières . Chacun indépendamment avec le type sélectionné parmiint
,long
oulong long
. Le compilateur utilise le premier type de ces 3 dans lequel s'inscrit la constante entière .1000 * 1000 * 1000 * 1000
se fait avec lesint
mathématiques comme chacun1000
dans unint
. Le produit déborde de 32 bitsint
.1000000000000
est certainement représentable comme unlong long
(ou peut-être plus étroit) - pas de débordement. Le type de ciblelong long Duration
n'affecte pas ce "côté droit de la destruction =".int
,long x = 1000 * 1000 * 1000L;
déborderait, alorslong x = 1000L * 1000 * 1000;
que non.Pour plus de lisibilité.
Placer des virgules et des espaces entre les zéros (
1 000 000 000
ou1,000,000,000
) produirait une erreur de syntaxe, et avoir1000000000
dans le code rend difficile de voir exactement combien de zéros il y a.1000*1000*1000
montre que c'est 10 ^ 9, car nos yeux peuvent traiter les morceaux plus facilement. De plus, il n'y a pas de coût d'exécution, car le compilateur le remplacera par la constante1000000000
.la source
1,000,000,000
ne produirait pas d'erreur de syntaxe, cela signifierait simplement autre chose. Par exempleCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
aussi le séparateur :)'
séparateur, en C ++ 14, donc vous pouvez l'utiliser1'000'000'000
. (Il a été choisi parce qu'il1,000,000,000
pourrait être mal interprété comme l'opérateur virgule ou 4 paramètres distincts, et_1_000_000_000
c'est un nom de variable valide (mais probablement mauvais).)Pour plus de lisibilité. À titre de comparaison, Java prend
_
en charge les nombres pour améliorer la lisibilité (d'abord proposé par Stephen Colebourne en réponse à la PROPOSITION de Derek Foster: Binary Literals for Project Coin / JSR 334). On écrirait1_000_000_000
ici.Dans l'ordre chronologique, du support le plus ancien au plus récent:
"(1)1111 1111"
( apparemment pas pour les valeurs décimales, uniquement pour les chaînes binaires représentant des valeurs binaires, quartales, octales ou hexadécimales )1$000$000
1_000_000_000
1'000'000'000
C'est une fonctionnalité relativement nouvelle pour les langages de se rendre compte qu'ils devraient prendre en charge (et puis il y a Perl). Comme dans l'excellente réponse de chux @,
1000*1000...
est une solution partielle mais ouvre le programmeur aux bogues de débordement de la multiplication même si le résultat final est un grand type.la source
Cela pourrait être plus simple à lire et à obtenir des associations avec le
1,000,000,000
formulaire.D'un point de vue technique, je suppose qu'il n'y a aucune différence entre le nombre direct ou la multiplication. Le compilateur le générera de toute façon sous la forme d'un milliard constant.
Si vous parlez d'objectif-c,
1000^3
cela ne fonctionnera pas car il n'y a pas une telle syntaxe pour pow (c'est xor). Au lieu de cela, lapow()
fonction peut être utilisée. Mais dans ce cas, ce ne sera pas optimal, ce sera un appel de fonction d'exécution et non une constante générée par le compilateur.la source
Pour illustrer les raisons, considérez le programme de test suivant:
la source
Une autre façon d'obtenir un effet similaire en C pour les nombres décimaux est d'utiliser la notation littérale à virgule flottante - tant qu'un double peut représenter le nombre souhaité sans aucune perte de précision.
IEEE 754 64 bits double peut représenter n'importe quel entier non négatif <= 2 ^ 53 sans problème. En règle générale, un double long (80 ou 128 bits) peut aller encore plus loin que cela. Les conversions seront effectuées au moment de la compilation, il n'y a donc pas de surcharge d'exécution et vous recevrez probablement des avertissements s'il y a une perte de précision inattendue et que vous avez un bon compilateur.
la source