Venant dun fond Java et C #, jai « appris à utiliser int
(32 bits) chaque fois que je ont besoin dun nombre entier et double
(64 bits) lorsquil sagit de valeurs fractionnaires. La plupart des méthodes de leurs frameworks respectifs (JVM et .NET) attendent généralement ces deux types.
Ma question est la suivante: pourquoi nutilisons-nous pas à la fois long
et double
pour la cohérence? Je sais quavoir 64 bits de précision en nombres entiers nest pas nécessaire la plupart du temps, mais là encore, nous navons généralement pas besoin de 64 bits de précision en nombres à virgule flottante, nest-ce pas?
Quest-ce que cest le raisonnement derrière cela, le cas échéant?
Commentaires
A nswer
Plage par rapport à la précision
Une chose est que je conteste lidée que le nombre à virgule flottante le plus courant utilise une représentation DPFP (virgule flottante double précision) 64 bits.
Au moins dans les conditions réelles critiques pour les performances. champs temporels comme les jeux, SPFP (virgule flottante simple précision) est encore beaucoup plus courant, car lapproximation et la vitesse sont préférables à la plus grande précision.
Pourtant, peut-être une façon de voir cela est quun 32 -bit int
représente une plage dentiers 2^32
(~ 4,3 milliards). Lutilisation la plus courante des nombres entiers va probablement être en tant quindices aux éléments, et cest « une gamme assez saine déléments quil serait difficile de dépasser sans dépasser la mémoire disponible avec le matériel daujourdhui *.
* Notez que des erreurs de mémoire insuffisante peuvent survenir lors de lallocation / de laccès à un seul bloc contigu de 4 gigaoctets même avec 30 gigaoctets libres, par exemple en raison de la contiguïté exigences de ce bloc.
Un entier 32 bits nest pas toujours plus efficace au niveau de linstruction, mais il a tendance à être généralement plus efficace lorsquil est agrégé dans un tableau, par exemple, car il nécessite la moitié de la mémoire (plus dindices pouvant tenir dans une seule page / ligne de cache, par exemple).
Notez également que comme Lightness Races in Orbit
souligne que ce nest même pas nécessairement vrai dun point de vue général que les entiers 32 bits sont plus couramment utilisés. Jai ma perspective étroite venant dun champ où les ints
32 bits sont souvent agrégés par centaines de milliers à millions en tant quindices dans une autre structure – là, la réduction de moitié de la taille peut aider un
Désormais, le DPFP 64 bits pourrait être utilisé beaucoup plus que des entiers 64 bits dans certains contextes. Là, les bits supplémentaires ajoutent de la précision plutôt que de la plage . De nombreuses applications peuvent exiger de la précision, ou du moins avoir une programmation temporelle beaucoup plus facile avec une précision supplémentaire disponible. Cest donc probablement la raison pour laquelle les DPFP 64 bits pourraient être plus courants que les entiers 64 bits dans certaines zones, et pourquoi int
pourrait encore être 32 bits dans de nombreux scénarios, même sur des plates-formes 64 bits.
Commentaires
- Je ‘ d contester lidée que le type de données intégral le plus courant a également une largeur de 32 bits, du moins dans les programmes écrits aujourdhui sur du matériel de base. Les plates-formes 64 bits sont si répandues maintenant.
- @I Ke: Le fait est que je soupçonne que beaucoup de logiciels utilisent simplement
int
etlong
sans vraiment se soucier de la portée … et ce logiciel utilise, je crois, principalement des entiers 64 bits dans les deux cas de nos jours. - Hmm, je suis corrigé; apparemment
int
est généralement toujours 32 bits , en grande partie pour éviter dintroduire des bogues dans ce type de code. Daccord, vous ‘ avez toujourssize_t
etlong
. - @LightnessRacesinOrbit Ah je vois, je ‘ suis extrêmement biaisé car je travaille souvent dans des bases de code qui agrègent des entiers dans une structure de données avec un souci de la taille totale de la mémoire. Jai essayé de rendre ma réponse aussi neutre que possible.
- @I ke: Personnellement, je fais tous mes types de taille explicite aussi.Mais vous et moi sommes sans aucun doute anormaux. 🙂
Réponse
Eh bien, int et double est une chose Java. Par exemple, dans Objective-C et Swift, vous utiliseriez NSInteger ou Int, qui est 32 bits sur une machine 32 bits et 64 bits sur une machine 64 bits. Suffisamment grand pour compter nimporte quel nombre déléments qui pourraient être en mémoire. Ce qui est vraiment utile, cest dutiliser le même type presque partout, sauf si dans une situation particulière vous avez besoin dautre chose.
Java essaie davoir un code qui sexécute de la même façon sur nimporte quelle implémentation, donc ils pensent que vous devriez utiliser le même type indépendamment de la machine que vous utilisez, et que le type devrait avoir le même nombre de bits indépendamment de la machine. Objective-C et Swift (ainsi que C, C ++) ont un point de vue différent.
Les nombres entiers sont principalement utilisés pour compter les choses, et généralement vous navez pas beaucoup de choses à compter. Larithmétique en virgule flottante a besoin de précision, et la virgule flottante 32 bits ne vous donne souvent pas assez de précision. Utiliser 64 bits double partout vous donne une chance de toujours avoir suffisamment de précision, sans être un spécialiste de larithmétique à virgule flottante. float doesn « t.
Mais quelle cohérence lutilisation de longs et doubles vous donnerait-elle? Les nombres entiers et les nombres à virgule flottante ne sont pas la même chose. Il nest pas nécessaire quils aient une taille de bits cohérente. Jutilise des points 2D et rectangles beaucoup. Donc, par souci de cohérence, devraient-ils aussi être 64 bits? Points ayant 32 bits par composant, et rectangles ayant 16? Bien sûr que non. Aucune cohérence nécessaire.
Commentaires
- Cest une très belle réponse expliquant le côté JVM de garder la taille de chaque type la même quelle que soit la plate-forme.
Réponse
short, int, single et double ont la même taille en java que dans la plupart des compilateurs C pour les plates-formes 32 bits et 64 bits et C comme java considère clairement int comme le type entier principal et double comme le type principal à virgule flottante. Je pense quil est raisonnable de dire que Java a hérité de cette convention des compilateurs C courants à lépoque.
Les entiers sont généralement utilisé pour c Compter ou indexer des trucs. Il est assez rare (mais pas inconnu) de devoir compter ou indexer plus de 2 milliards de quelque chose. En effet, avant C99, vous deviez utiliser des types spécifiques au fournisseur si vous vouliez un entier 64 bits.
Les nombres à virgule flottante sont généralement utilisés comme une approximation des nombres réels. La simple précision est assez bonne la plupart du temps, mais il nest pas difficile de trouver des problèmes où elle provoque une quantité inacceptable derreurs darrondi. Je mattends à ce que la demande du calcul scientifique soit ce qui a conduit la prise en charge de la virgule flottante à double précision à être omniprésente bien avant 64 bits le support des entiers létait.
Ce que je trouve curieux, cest que C semble encourager lutilisation de double alors que fortran semble encourager lutilisation de la simple précision.
BigDecimal
pour les nombres à virgule flottante, depuis larrondi et comparer les valeurs FP est tellement problématique.