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 ?
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 ?
L'une des raisons de déclarer les constantes de manière multiplicative est d'améliorer la lisibilité, sans affecter les performances d'exécution. Cela permet également d'indiquer que l'auteur a pensé au nombre d'une manière multiplicative.
Considérez ceci :
double memoryBytes = 1024 * 1024 * 1024;
C'est nettement mieux que :
double memoryBytes = 1073741824;
car ce dernier ne semble pas, à première vue, être la troisième puissance de 1024.
Comme l'a mentionné Amin Negm-Awad, la ^
est l'opérateur binaire XOR
. De nombreux langages ne disposent pas d'un opérateur d'exponentiation intégré à la compilation, d'où la multiplication.
Et dans les langages qui disposent d'un opérateur d'exponentiation, celui-ci n'est pas nécessairement "^". En Fortran, par exemple, c'est "**".
Vous devriez également inclure un lien pointant vers la mise en garde importante, donnée dans la réponse ci-dessous, de @chux : stackoverflow.com/a/40637622/1841533 (d'autant plus que le PO a étiqueté "c", qui est très sensible à ce problème de "l'opération du côté droit semble avoir tous les termes limités à un type plus petit, et donc la multiplication peut déborder"). securecoding.cert.org/confluence/display/c/ peut aider à éviter ces problèmes dans le cas général ?
Il convient également de noter que le calcul est effectué au moment de la compilation. La norme C exige que l'implémentation soit capable de calculer des expressions constantes au moment de la compilation pour diverses caractéristiques du langage et nous pouvons supposer sans risque que c'est le cas lorsqu'une expression constante est utilisée comme dans cet exemple.
Il y a des raisons pas à utiliser 1000 * 1000 * 1000
.
Avec 16 bits int
, 1000 * 1000
déborde. Ainsi, l'utilisation de 1000 * 1000 * 1000
réduit la portabilité.
Avec 32-bit int
la première ligne de code suivante déborde.
long long Duration = 1000 * 1000 * 1000 * 1000; // overflow
long long Duration = 1000000000000; // no overflow, hard to read
Suggérer que la valeur du plomb corresponde au type de destination pour des raisons de lisibilité et de portabilité. y l'exactitude.
double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;
On pourrait aussi utiliser simplement e
pour les valeurs qui sont exactement représentables sous la forme d'un double
. Bien entendu, cela conduit à savoir si double
peut représenter exactement la valeur du nombre entier, ce qui pose problème pour les valeurs supérieures à 1e9 (voir DBL_EPSILON
et DBL_DIG
).
long Duration = 1000000000;
// vs.
long Duration = 1e9;
Remarque très importante ! securecoding.cert.org/confluence/display/c/ peut aider dans de nombreux cas ?
@EdgarBonet C'est vrai binaire64 peut représenter des nombres entiers jusqu'à environ 9e15. Mais C ne précise pas double
l'utilisation de binary64, bien qu'il soit très couramment utilisé. Selon les spécifications du langage C, les valeurs jusqu'à 1e9 environ sont exactement représentables. Tout dépend si vous voulez coder selon les spécifications ou si vous vous fiez à la pratique courante.
Pourquoi pas
1000^3
?
Le résultat de 1000^3
est de 1003. ^
est l'opérateur bit-XOR.
Même s'il ne s'agit pas de la question elle-même, j'apporte une précision. x^y
fait pas sont toujours évalués à x+y
comme dans l'exemple de l'auteur de la question. Il faut xer chaque bit. Dans le cas de l'exemple :
1111101000 (1000)
0000000011 (3)
1111101011 (1003)
Mais
1111101001 (1001)
0000000011 (3)
1111101010 (1002)
Monsieur, je ne comprends pas bien comment 1003^3 est 1003. Google et Mac Calculator montrent que 1000^3 = 1,000,000,000. Pouvez-vous m'expliquer ?
Les ^
signifie XOR en C/C++/Objective-C, etc. Dans les calculatrices, il signifie généralement x à la puissance y.
Pour plus de lisibilité.
En plaçant des virgules et des espaces entre les zéros ( 1 000 000 000
o 1,000,000,000
) produirait une erreur de syntaxe, et le fait d'avoir 1000000000
dans le code ne permet pas de voir exactement le nombre de zéros.
1000*1000*1000
permet de voir qu'il s'agit de 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 constante 1000000000
.
Pour information, il existe un concept de séparateurs de chiffres que j'ai appris à connaître récemment. Java l'a depuis un certain temps déjà, et C# 7.0 pourrait l'obtenir. J'aimerais que tous les langages disposent de cette fonctionnalité intéressante :)
Selon le contexte, l'utilisation de 1,000,000,000
ne produirait pas d'erreur de syntaxe, elle signifierait simplement autre chose. Par exemple CMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
@JMS10 C# l'a déjà si vous installez la version preview de VS15, elle peut être écrite comme suit 1_000_000_000
Pour plus de lisibilité. À titre de comparaison, Java prend en charge _
en nombre pour améliorer la lisibilité (proposé pour la première fois par Stephen Colebourne en tant qu'outil de gestion de l'information). Réponse à la PROPOSITION de Derek Foster : Littéraux binaires pour Project Coin/JSR 334) . On pourrait écrire 1_000_000_000
ici.
Dans un ordre à peu près chronologique, du soutien le plus ancien au plus récent :
"(1)1111 1111"
( apparemment pas pour les valeurs décimales, seulement pour les chaînes de bits représentant des valeurs binaires, quartales, octales ou hexadécimales )1$000$000
1_000_000_000
1'000'000'000
Il s'agit d'une fonctionnalité relativement nouvelle pour les langages qui réalisent qu'ils doivent la prendre en charge (et puis il y a Perl). Comme dans l'excellente réponse de chux@, 1000*1000...
est une solution partielle, mais elle expose le programmeur à des bogues dus au débordement de la multiplication, même si le résultat final est un grand type.
De nombreux langages de programmation modernes ont la même chose, par exemple Swift. Rien de nouveau.
Il est assez récente, cependant. La fonction Java a peut-être 5 ans. La plupart des autres langages supportant cette syntaxe sont assez récents - Swift lui-même n'a que quelques années. Python ajoute la prise en charge dans la version 3.6, qui n'a pas encore été publiée.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
46 votes
Clarté et lisibilité du code. Vous ne pouvez pas utiliser , ou ' comme séparateurs en C, donc la meilleure solution est de calculer la valeur d'une multiplication. ^ est un opérateur non apparenté en C - OU exclusif.
54 votes
Il est surtout utilisé pour des durées telles que : 2*60*60 il est facile de remarquer qu'il s'agit de 2 heures .
53 votes
D'une part, je pense que 1 000 000 000 n'est pas une syntaxe valable.
2 votes
@Paparazzi Même s'il s'agissait d'une syntaxe valide, la syntaxe devrait être localisée. Dans de nombreuses régions du monde, ',' est la marque décimale.
15 votes
D'ailleurs, les langages de programmation modernes proposent d'autres façons d'écrire la même chose, par exemple en Swift
1_000_000_000
. Cependant, avec les constantes de temps, c'est plus difficile. Il est plus facile d'écrire30 * 60
(30 minutes en secondes) que d'écrire1800
. Il existe actuellement des langages qui vous permettent d'écrire des unités, par exemplemeters
vous permettant de vous protéger contre les mauvaises affectations.0 votes
Un autre petit avantage de 1000*1000*1000 par rapport à 1000^3 (si l'opérateur puissance existe dans la langue) est qu'il est plus facile de voir rapidement l'ordre de grandeur.
2 votes
Pour la même raison
1.0f / 255
est plus lisible que0.0039215689f
. Voir ceci poste .0 votes
Par ailleurs, si vous travaillez beaucoup avec des unités physiques, recherchez des bibliothèques qui fournissent des classes pour l'écriture d'unités, par exemple,
1000 * Kilometers
o15_min
.29 votes
^
est un XOR, et non un exposant ou un opérateur de puissance.0 votes
@DavidLively Voir ce commentaire .
11 votes
@Paparazzi : En C++,
1,000,000,000
est une syntaxe valide et s'évalue à0
.5 votes
Pour moi, il est plus confortable de voir 1e9 que 1000*1000*1000 :)
0 votes
Votre question porte-t-elle sur C ou Objective C ?
1 votes
@kot331107 : bien mais ce serait une
double
littéral, et non unint
.0 votes
@MatteoItalia uhm...donc tu peux le transformer en int à la place si tu en as besoin :)
4 votes
(1,000,000,000) == 0
3 votes
@Paparazzi, @MooingDuck : C++ supporte maintenant
1'000'000
!0 votes
@kot331107 - Avez-vous déjà entendu parler de l'erreur d'arrondi ?
1 votes
@Hot Licks C spécifie la précision et l'étendue minimales de @Hot Licks.
double
. Lesdouble
de @kot331107,1e9
est dans l'intervalle et exactement représentable comme undouble
Il n'y a donc pas d'erreur d'arrondi lors de la conversion en un nombre entier de 32(plus) bits. Les valeurs plus élevées peuvent poser des problèmes d'arrondi.1 votes
A titre d'information, le préprocesseur gcc acceptera
#define BILLION 1000 ## 000 ## 000
bien que le compilateur n'accepte pas1000 ## 000 ## 000
comme un littéral. Je ne sais pas si cela s'applique à l'objectif-c ou non.0 votes
Duplicata possible de Représenter les grands nombres dans le code source pour plus de lisibilité ?
0 votes
Connexes : Pourquoi l'analyseur C n'autorise-t-il pas les espaces entre les chiffres d'un littéral entier ? , Pourquoi le caractère espace n'a-t-il pas été choisi pour les séparateurs de chiffres du C++14 ?
0 votes
@HotLicks rounding error with (int)1e9 ?
0 votes
@kot331107 - Peut-être pas pour cette valeur, mais si vous avez l'habitude d'utiliser le système, vous serez mordu.
0 votes
@HotLicks D'accord, mais cette certaine valeur 1e9.
0 votes
J'aime la façon dont Perl permet d'utiliser
_
en chiffres littéraux.0x24_0000_0000
et123_456
sont des littéraux parfaitement légitimes en Perl.0 votes
En rapport : Pourquoi le long long n = 2000*2000*2000*2000 ; déborde-t-il ?