Perte de précision d’un flottant à double et d’un double à flottant?

float fv = orginal_value; // original_value may be any float value ... double dv = (double)fv; ... fv = (float)dv; 

Fv DEVRAIT être exactement égal à original_value? Toute précision peut être perdue?

Fv DEVRAIT être exactement égal à original_value? Toute précision peut être perdue?

Oui, si la valeur de dv n’a pas changé entre les deux.

De la section Conversion 6.3.1.5 Types réels flottants dans les spécifications C99:

  1. Lorsqu’un flottant est promu doubler ou doubler long, ou qu’un doublé est promené doubler long, sa valeur rest inchangée .
  2. Quand un double est rétrogradé pour flotter, un double long est rétrogradé en double ou flottant, ou une valeur représentée avec une précision et une plage supérieures à celles requirejses par son type sémantique (voir 6.3.1.8) est explicitement convertie en son type sémantique, si le la valeur en cours de conversion peut être représentée exactement dans le nouveau type, elle est inchangée. Si la valeur en cours de conversion se situe dans la plage de valeurs pouvant être représentée mais ne pouvant pas être représentée exactement, le résultat est la valeur représentable la plus proche ou la plus basse, choisie d’une manière définie par l’implémentation. Si la valeur en cours de conversion se situe en dehors de la plage de valeurs pouvant être représentée, le comportement est indéfini.

Pour C ++, à partir de la section 4.6 aussi appelée conv.fpprom (brouillon utilisé: n337 et je crois que des lignes similaires sont disponibles dans les spécifications finales)

Une valeur de type float peut être convertie en une valeur de type double. La valeur est inchangée . Cette conversion est appelée promotion en virgule flottante.

Et la section 4.8 alias conv.double

Une valeur de type virgule flottante peut être convertie en une valeur de type autre. Si la valeur source peut être représentée exactement dans le type de destination , le résultat de la conversion est cette représentation exacte. Si la valeur source est comprise entre deux valeurs de destination adjacentes, le résultat de la conversion est un choix défini par l’implémentation de l’une ou l’autre de ces valeurs. Sinon, le comportement n’est pas défini. Les conversions autorisées en tant que promotions en virgule flottante sont exclues de l’ensemble des conversions en virgule flottante.

Donc, les valeurs doivent être égales exactement.