Question

Combien coûte la conversion d'un float en un double ? Est-ce aussi simple qu'un conversion int en long ?

EDIT: je suppose une plate-forme où float est 4 octets et double 8 octets

Était-ce utile?

La solution

Considérations relatives à la plate-forme

Cela dépend de la plate-forme utilisée pour le calcul flottant. Avec la FPU x87, la conversion est gratuite, car le contenu du registre est identique. Le seul prix que vous pouvez parfois payer est le trafic mémoire, mais dans la plupart des cas, il n’ya même pas de trafic, car vous pouvez simplement utiliser la valeur sans conversion. x87 est en fait une bête étrange à cet égard - il est difficile de faire la distinction entre les flottants et les doubles, car les instructions et les registres utilisés sont les mêmes, ce qui est différent sont les instructions de chargement / stockage et la précision du calcul est contrôlée à l'aide de bits d'état . L'utilisation de calculs flottants / doubles mixtes peut entraîner des résultats inattendus (de ce fait, des options de ligne de commande du compilateur permettent de contrôler le comportement exact et les stratégies d'optimisation).

Lorsque vous utilisez SSE (et parfois Visual Studio utilise SSE par défaut), cela peut être différent, car vous devrez peut-être transférer la valeur dans les registres FPU ou effectuer une opération explicite pour effectuer la conversion.

Performances d'économie de mémoire

En résumé, et pour répondre à votre commentaire ailleurs: si vous souhaitez stocker les résultats de calculs flottants dans une mémoire 32b, le résultat sera identique ou plus rapide, car:

  • Si vous faites cela sur x87, la conversion est gratuite - la seule différence sera fstp. dword [] sera utilisé à la place de fstp qword [].
  • Si vous faites cela avec SSE activé, vous pouvez même constater des gains de performances, car certains calculs peuvent être faits avec SSE une fois que la précision du calcul n’est plus que flottante au lieu du double par défaut.
  • Dans tous les cas, le trafic mémoire est plus faible

Autres conseils

Les flottements pour doubler les conversions se font gratuitement sur certaines plateformes (PPC, x86 si votre compilateur / runtime utilise le "pour en savoir plus sur le type que vous m'avez dit d'utiliser, je vais tout évaluer en double double de toute façon, nyah nyah " mode évaluation).

Dans un environnement x86 où l’évaluation en virgule flottante est réellement effectuée dans le type spécifié à l’aide de registres SSE, les conversions entre float et double sont presque aussi onéreuses que l’ajout ou la multiplication en virgule flottante (c’est-à-dire qu’il est peu probable que les performances vous en faites beaucoup ).

Dans un environnement intégré dépourvu de virgule flottante matérielle, ils peuvent être assez coûteux.

Ceci est spécifique à l'implémentation C ++ que vous utilisez. En C ++, le type à virgule flottante par défaut est double . Un compilateur doit émettre un avertissement pour le code suivant:

float a = 3.45;

car la valeur double 3.45 est affectée à un float. Si vous devez utiliser spécifiquement float, ajoutez la valeur f à la valeur:

float a = 3.45f;

Le fait est que tous les nombres à virgule flottante sont par défaut double . Il est prudent de s'en tenir à cette valeur par défaut si vous n'êtes pas sûr des détails d'implémentation de votre compilateur et si vous ne comprenez pas beaucoup le calcul en virgule flottante. Évitez les acteurs.

Voir également la section 4.5 du langage de programmation C ++ .

Je ne peux pas imaginer que ce serait trop complexe. La grande différence entre convertir int en long en convertissant float en double est que les types int ont deux composantes (signe et valeur), tandis que les nombres en virgule flottante ont trois composantes (signe, mantisse et exposant).

  

La précision simple IEEE 754 est codée   en 32 bits avec 1 bit pour le signe, 8   bits pour l'exposant et 23 bits pour   le significand. Cependant, il utilise un   bit caché, donc le significand est 24   bits (p = 24), même si c'est   codé en utilisant seulement 23 bits.

- David Goldberg, Ce que tout informaticien devrait savoir sur le point flottant Arithmétique

Ainsi, la conversion entre float et double va conserver le même bit de signe, définir les 23/24 derniers bits de la mantisse du float sur la mantisse du double et définir les 8 derniers bits de l'exposant du float sur l'exposant du double.

Ce comportement peut même être garanti par IEEE 754 ... Je n'ai pas vérifié, donc je ne suis pas sûr.

probablement un peu plus lent que la conversion de int en long, car la mémoire requise est plus grande et la manipulation plus complexe. Une bonne référence sur les problèmes d'alignement de la mémoire

.

Peut-être cette aide:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

double _ftod(float fValue)
{
  char czDummy[30];
  printf(czDummy,"%9.5f",fValue);
  double dValue = strtod(czDummy,NULL);
  return dValue;
}


int main(int argc, char* argv[])
{
  float fValue(250.84f);
  double dValue = _ftod(fValue);//good conversion
  double dValue2 = fValue;//wrong conversion
  printf("%f\n",dValue);//250.840000
  printf("%f\n",dValue2);//250.839996
  getch();
  return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top