Je suis toujours un débutant en programmation et j'ai toujours plus de questions que nos recherches de livres ou sur Internet ne peuvent en répondre (à moins que quelque chose ne me manque). Donc, je m'excuse par avance si cela a été répondu, mais je ne pouvais pas le trouver.
Je comprends que le flottant a une plage plus petite que le double, ce qui le rend moins précis. D'après ce que je comprends, long double est encore plus précis (?). Ma question est donc la suivante: pourquoi voudriez-vous utiliser une variable moins précise au départ? At-il quelque chose à voir avec différentes plates-formes, différentes versions de système d'exploitation, différents compilateurs? Ou existe-t-il des moments spécifiques de la programmation où il est stratégiquement plus avantageux d’utiliser un flotteur sur un double/long double?
Merci tout le monde!
Dans presque tous les processeurs, les nombres plus petits en virgule flottante prennent au moins le même cycle d'horloge dans l'exécution. Parfois, la différence n’est pas très grande (ou nulle), d’autres fois, elle peut être littéralement le double du nombre de cycles pour double
contre float
.
Bien entendu, l’empreinte mémoire, qui affecte l’utilisation de la mémoire cache, sera également un facteur. float
prend la moitié de la taille de double
et long double
est encore plus gros.
Edit: un autre effet secondaire de la taille réduite est que les extensions SIMD du processeur (3DNow !, SSE, AVX en x86 et des extensions similaires sont disponibles dans plusieurs autres architectures) peuvent ne fonctionner qu'avec float
ou prendre deux fois plus de float
vs. double
(et autant que je sache, aucune instruction SIMD n'est disponible pour long double
dans aucun processeur). Cela peut donc améliorer les performances si float
est utilisé par rapport à double
, en traitant deux fois plus de données en une fois. Terminez la modification.
Donc, supposer que la précision de 6-7 chiffres est suffisante pour répondre à vos besoins et que la plage de +/- 10+/- 38 est suffisant, alors float
devrait être utilisé. Si vous avez besoin de plusieurs chiffres ou d'une plage plus grande, passez à double
, et si cela ne suffit pas, utilisez long double
. Mais pour la plupart des choses, double
devrait être parfaitement adéquat.
De toute évidence, il est important d’utiliser "la bonne taille" le plus souvent lorsque vous devez travailler avec beaucoup de calculs ou de données - s'il y a 5 variables et que vous ne les utilisez que quelques fois dans un programme un million d'autres choses, qui s'en soucie? Si vous effectuez des calculs de dynamique des fluides pour évaluer le rendement d’une voiture de Formule 1 à 200 km/h, vous avez probablement plusieurs dizaines de millions de points de données à calculer, et chaque point de données doit être calculé des dizaines de fois par seconde, L'utilisation de quelques cycles d'horloge supplémentaires lors de chaque calcul allongera considérablement la durée de la simulation.
L’utilisation de float a deux coûts, l’évident de sa portée et de sa précision limitées et, moins évident, de l’analyse plus difficile imposée par ces limitations.
Il est souvent relativement facile de déterminer que le double est suffisant, même dans les cas où il faudrait beaucoup d’analyses numériques pour démontrer que le flottant est suffisant. Cela réduit les coûts de développement et le risque de résultats incorrects si l'analyse plus difficile n'est pas effectuée correctement.
Le principal avantage de Float sur de nombreux processeurs est son encombrement mémoire réduit. Cela se traduit par plus de nombres par ligne de cache et plus de bande passante mémoire en termes de nombres transférés par seconde. Tout gain en performances de calcul est généralement relativement faible - en effet, les processeurs courants effectuent toutes les opérations arithmétiques en virgule flottante dans un format plus large que double.
Il semble préférable d’utiliser double si les deux conditions ne sont pas remplies: il existe suffisamment de nombres pour que leur encombrement mémoire soit un problème de performances importante, et les développeurs peuvent montrer que la méthode float est suffisamment précise.
Vous voudrez peut-être voir la réponse affichée ici Devrais-je utiliser double ou float?
Mais cela se résume à l’empreinte mémoire par rapport à la précision dont vous avez besoin pour une situation donnée. Dans un moteur physique, la précision peut vous intéresser davantage, il serait donc plus logique d’utiliser un double ou un double long.
Conclusion: Vous ne devez utiliser que la précision nécessaire pour un algorithme donné.
Le principe de base serait de ne pas utiliser plus que ce dont vous avez besoin.
La première considération est l'utilisation de la mémoire, vous vous êtes probablement déjà rendu compte que, si vous ne faites qu'un double, rien de grave, mais que se passe-t-il si vous créez un milliard plutôt que deux fois plus d'espace mémoire?
Suivant l'utilisation des processeurs, je pense que sur de nombreux processeurs, si vous utilisez des types de données plus petits, vous pouvez effectuer une forme de thread où plusieurs opérations sont effectuées simultanément.
Donc, une extension de cette partie de la réponse est SSE instructions en gros, cela vous permet d’utiliser des données condensées de faire plusieurs opérations en virgule flottante simultanément, ce qui dans un cas idéalisé peut doubler la vitesse de votre programme.
Enfin, la lisibilité, quand quelqu'un lit votre code si vous utilisez un float, il réalisera immédiatement que vous ne dépassez pas un certain nombre. OMI parfois, le bon nombre de précision circulera mieux dans le code.
Un nombre float utilise moins de mémoire qu'un double. Par conséquent, si vous n'avez pas besoin que votre nombre soit de la taille d'un double, vous pouvez également utiliser un nombre float puisqu'il prend moins de mémoire.
Tout comme vous n'utiliseriez pas un bus pour vous conduire, vous et un ami, à la plage ... vous seriez bien mieux d'aller dans une voiture à 2 places.
La même chose s'applique pour un double sur un long double ... ne réservez que la quantité de mémoire dont vous aurez besoin. Sinon, avec un code plus complexe, vous courez le risque d'utiliser trop de mémoire et de ralentir ou de ralentir les processus.