Question

type de virgule flottante est un nombre en stockant ses chiffres significatifs et son exposant séparément sur des mots binaires distincts afin de l'adapter à 16, 32, 64 ou 128 bits.

Type de point fixe stocke les nombres avec 2 mots, l'un représentant la partie entière, un autre représentant la partie écoulée de la base, dans des exposants négatifs, 2 ^ -1, 2 -2 ^, 2 ^ -3, etc.

Float sont mieux parce qu'ils ont une portée plus large dans un sens exposant, mais pas si l'on veut numéro de magasin avec plus de précision pour une certaine gamme, par exemple en utilisant seulement entier -16 à 16, en utilisant ainsi plus de bits pour les chiffres de maintien au-delà du radix.

En termes de performances, que l'on a les meilleures performances, ou y at-il des cas où certains est plus rapide que l'autre?

Dans la programmation de jeux vidéo, fait à virgule flottante d'utilisation de tout le monde parce que la FPU rend plus rapide, ou parce que la baisse de performance est juste négligeable, ou font-ils leur propre type fixe?

Pourquoi est-il pas de type fixe en C / C ++?

Était-ce utile?

La solution

Cette définition couvre un sous-ensemble très limité de mises en œuvre de points fixes.

Il serait plus exact de dire que le point fixe que la mantisse est stockée et l'exposant est une constante déterminée a priori. Il n'y a pas d'obligation pour le point binaire à tomber à l'intérieur du mantisse, et certainement pas nécessaire que tomber sur une limite de mot. Par exemple, tous les éléments suivants sont « point fixe »:

  • 64 bits mantisse, mis à l'échelle de 2 -32 (cela correspond à la définition figurant dans la question)
  • 64 bits de mantisse, mis à l'échelle par 2 -33 (maintenant les parties entières et fractionnaires ne peuvent pas être séparés par une limite d'octet)
  • 32 bits de mantisse, mis à l'échelle par 2 4 (maintenant il n'y a pas de partie fractionnaire)
  • 32 bits de mantisse, mis à l'échelle par 2 -40 (maintenant il n'y a pas de partie entière)

GPU ont tendance à utiliser point fixe sans partie entière (typiquement mantisse de 32 bits mis à l'échelle par 2 -32 ). API Par conséquent telles que OpenGL et Direct3D utilisent souvent les types à virgule flottante qui sont capables de tenir ces valeurs. Cependant, la manipulation du mantisse entier est souvent plus efficace si ces API permettent de spécifier les coordonnées (dans l'espace de la texture, l'espace colorimétrique, etc.) de cette façon aussi.

Quant à votre affirmation selon laquelle C ++ ne dispose pas d'un type de point fixe, je suis en désaccord. Tous les types d'entiers en C ++ sont les types de point fixe. L'exposant est souvent supposé nul, mais ce n'est pas nécessaire et j'ai un peu de code DSP point fixe implémenté en C ++ ainsi.

Autres conseils

Au niveau du code, arithmétique à virgule fixe est simplement arithmétique entière avec un dénominateur implicite.

Pour de nombreuses opérations arithmétiques simples, les opérations de point fixe et entier sont essentiellement les mêmes. Toutefois, il existe certaines opérations dont les valeurs intermédiaires doivent être représentés par un nombre plus élevé de bits, puis arrondis. Par exemple, pour multiplier deux nombres à virgule fixe à 16 bits, le résultat doit être stockée temporairement dans 32 bits avant la renormalisation (ou saturant) retour au point fixe de 16 bits.

Lorsque le logiciel ne tire pas parti de vectorisation (comme SIMD à base de CPU ou GPGPU), entier et arithmeric point fixe est plus rapide que la FPU. Lorsque vectorisation est utilisé, l'efficacité de vectorisation importe beaucoup plus, de sorte que les différences de performance entre point fixe et à virgule flottante est sans objet.

Certaines architectures fournissent des implémentations matérielles pour certaines fonctions mathématiques, comme sin, cos, atan, sqrt, pour les types à virgule flottante seulement. Certaines architectures ne fournissent aucune implémentation matérielle du tout. Dans les deux cas, les bibliothèques de logiciels de mathématiques spécialisés peuvent fournir ces fonctions en utilisant uniquement des nombres entiers ou arithmétique à virgule fixe. Souvent, ces bibliothèques offriront plusieurs niveaux de precisions, par exemple, des réponses qui ne sont jusqu'à précises à N-bits de précision, ce qui est inférieur à la pleine précision de la représentation. Les versions de précision limitée peut être plus rapide que la version la plus haute précision.

point fixe est largement utilisé dans DSP et systèmes embarqués où souvent le processeur cible n'a pas FPU, et le point fixe peut être raisonnablement mis en œuvre en utilisant efficacement un entier ALU.

En termes de performance, qui est likley varier en fonction de l'architecture cible et de l'application. Il est évident que s'il n'y a pas FPU, alors point fixe sera beaucoup plus rapide. Lorsque vous avez un FPU cela dépendra de l'application aussi. Par exemple exécuter certaines fonctions telles que sqrt () ou log () sera beaucoup plus rapide lorsqu'il est directement pris en charge dans le jeu d'instructions plutôt thna mises en œuvre algorithmiquement.

Il n'y a pas de type de point fixe intégré en C ou C ++ j'imagine parce qu'ils (ou au moins C) ont été envisagées comme langues de niveau des systèmes et la nécessité point fixe est un peu spécifique de domaine, et aussi peut-être parce que sur un usage général processeur il n'y a généralement pas de support direct au matériel pour le point fixe.

En C ++ définissant une classe de type de données à virgule fixe avec l'opérateur appropriés surcharges et fonctions mathématiques associées peuvent facilement surmonter cette shortcomming. Cependant, il existe des solutions bonnes et mauvaises à ce problème. bon par exemple peuvent être trouvés ici: http://www.drdobbs.com / cpp / 207000448 . Le lien vers le code dans cet article est cassé, mais je suivis vers le bas ftp: / /66.77.27.238/sourcecode/ddj/2008/0804.zip

Le diferrence entre virgule flottante et les mathématiques entier dépend de la CPU que vous avez à l'esprit. Sur Intel puces la différence est grande dans clockticks. mathématiques Int est encore plus rapide car il y a multiple entier ALU est qui peut fonctionner en parallèle. Compilateurs sont aussi intelligent d'utiliser des instructions de calcul d'adresse spéciales pour optimiser ajouter / multiplier dans une seule instruction. compte de conversion comme une opération aussi, donc il suffit de choisir votre type et de s'y tenir.

En C ++, vous pouvez construire votre propre type de calcul de point fixe. Vous définissez comme struct avec un int et passer outre les surcharges appropriées et leur faire faire ce qu'ils font normalement plus un changement de remettre le comma à la bonne position.

Vous devez être prudent lors de l'examen « précision » dans ce contexte.

Pour le même nombre de bits dans la représentation de la valeur de point fixe maximum a plus bits significatifs que toute valeur à virgule flottante (car le format de virgule flottante doit donner quelques bits loin à l'exposant), mais la valeur du point fixe minimum est moins que toute valeur à virgule flottante non dénormaliser (parce que les déchets de valeur de point fixe la plupart de ses mantisse dans des zéros non significatifs).

En outre, selon la façon dont vous divisez le nombre de point fixe en place, la valeur en virgule flottante peut être en mesure de représenter petits nombre qui signifie qu'il a une représentation plus précise de « minuscule mais non nulle » .

Et ainsi de suite.

Vous ne en flottant dans les jeux, car il est plus rapide ou plus lent que vous utilisez parce qu'il est plus facile de mettre en œuvre les algorithmes en virgule flottante que point fixe. Vous assumez la raison doit faire avec la vitesse de calcul et qui ne sont pas la raison, il doit faire avec la facilité de programmation.

Par exemple vous pouvez définir la largeur de l'écran / fenêtre comme allant de 0,0 à 1,0, la hauteur de l'écran 0.0 à 1.0. La profondeur de la parole de 0,0 à 1,0. etc. mathématiques Matrix, etc. rend les choses réelles faciles à implémenter. Faites tous les calculs de cette façon jusqu'au point où vous devez calculer des pixels réels sur une réelle taille de l'écran, par exemple 800x400. Projet le rayon de l'œil au point sur l'objet dans le monde et compute où il transperce l'écran, en utilisant 0 à 1 mathématiques, puis multiplier x par 800, y fois 400 et un lieu qui pixel.

virgule flottante ne stocke pas l'exposant et la mantisse séparément et la mantisse est un nombre maladroit, ce qui reste après l'exposant et du signe, comme 23 bits, et non pas 16 ou 32 ou 64 bits.

flottants mathématiques point à ses utilisations de base logique à virgule fixe avec une logique supplémentaire et des étapes supplémentaires nécessaires. Par définition des pommes par rapport aux pommes mathématiques du point fixe est moins cher parce que vous n'avez pas à manipuler les données sur le chemin dans l'alu et n'ont pas à manipuler les données sur la sortie (Normaliser). Lorsque vous ajoutez à IEEE et tous ses déchets qui ajoute encore plus logique, les cycles d'horloge plus, etc. (correctement signé l'infini, calme et nans de signalisation, des résultats différents pour une même opération s'il est un gestionnaire d'exception activé). Comme quelqu'un a fait remarquer dans un commentaire dans un système réel où vous pouvez faire fixe et flottant en parallèle, vous pouvez profiter de quelques-uns ou tous les processeurs et récupérer des horloges de cette façon. à la fois avec flotteur et fréquence d'horloge fixe peut être augmentée en utilisant de grandes quantités de biens immobiliers à puce, fixe restera moins cher, mais flotteur peut approcher des vitesses fixes en utilisant ce genre de tours ainsi que le fonctionnement en parallèle.

Une question ne sont pas couverts est la réponse est une consommation d'énergie. Bien que cela dépend fortement de l'architecture matérielle spécifique, généralement FPU consomme beaucoup plus d'énergie que dans ALU CPU ainsi si vous ciblez des applications mobiles où la consommation d'énergie est importante la valeur de ce point de considérer impelementation fixe de l'algorithme.

Cela dépend de ce que vous travaillez. Si vous utilisez point fixe alors vous perdez précision; vous devez sélectionner le nombre de places après la décimale (qui peut ne pas être toujours assez bon). En virgule flottante vous n'avez pas à vous soucier de ce que la précision offerte est presque toujours assez bon pour la tâche à la main - utilise une implémentation de formulaire standard pour représenter le nombre

.

Les avantages et les inconvénients se résument à la vitesse et les ressources. Sur les plateformes 32bits et 64bits modernes, il est vraiment pas nécessaire d'utiliser le point fixe. La plupart des systèmes sont fournis avec le FPU qui sont à optimiser câblé pour les opérations de point fixe. En outre, la plupart des intrinsics CPU modernes viennent avec des opérations telles que l'ensemble SIMD qui méthodes basées aide optimize vecteur via vectorisation et le déroulement. Donc, point fixe ne vient que d'un côté vers le bas.

Sur les systèmes embarqués et les petits microcontrôleurs (8bit et 16bit) vous ne pouvez pas avoir un FPU, ni jeux d'instructions étendues. Dans ce cas, vous pouvez être obligé d'utiliser des méthodes de point fixe ou les jeux d'instructions à virgule flottante limité qui ne sont pas très rapides. Donc, dans ces circonstances point fixe sera un meilleur - ou même votre seul -. Choix

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top