Question

Je me suis cogné la tête toute la journée. Le projet C ++ sur lequel je travaille actuellement doit impérativement afficher une valeur modifiable. Le chiffre actuellement sélectionné affiche la valeur incrémentée au dessus et la valeur décrémentée en dessous pour ce chiffre. Il est utile de pouvoir référencer la valeur modifiable sous forme de nombre et de collection de chiffres. Ce qui serait génial, c’est qu’il existe une forme indexable d’un nombre à virgule flottante, mais j’ai été incapable de trouver une telle solution. Je pose cette question là-bas pour voir s’il manque quelque chose d’évident ou si je devais me lancer moi-même.

Merci pour le conseil! J'espérais une solution qui ne convertirait pas float - > chaîne - > int, mais je pense que c’est le meilleur moyen de s’éloigner des problèmes de quantification à virgule flottante. J'ai fini par utiliser boost :: format et me contenter de référencer les caractères individuels de la chaîne. Je ne vois pas cela comme une énorme différence de performances par rapport à l’utilisation de combinaisons de modf et de fmod pour tenter d’obtenir un chiffre dans un flottant (c’est probablement ce qui se passe dans les coulisses, mais avec plus de robustesse que mon implémentation).

Était-ce utile?

La solution

La représentation interne des nombres à virgule flottante ne ressemble pas à ce que vous voyez. Vous ne pouvez lancer que très fort.

Pour lancer, procédez comme suit:

char string[99];
sprintf(string,"%f",floatValue);

Ou voir ceci: http: // www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

L'article de Wikipédia peut en apprendre davantage sur la représentation: http://fr.wikipedia.org/wiki/ Floating_point

Autres conseils

Oh, il existe de nombreuses façons de convertir une chaîne. ( Bien que je préfère s n printf () moi-même.)

Vous pouvez également convertir en int et extraire les chiffres avec module et division entière. Vous pouvez compter le nombre de chiffres avec log {base10}.

(N'oubliez pas: journal {baseA} _X / journal {baseA} _B = journal {baseB} _X.)

Exemple:

#define SHOW(X) cout << # X " = " << (X) << endl

int
main()
{
  double d = 1234.567;

  SHOW( (int(d)%10000) / 1000 );
  SHOW( (int(d)%1000)  / 100  );
  SHOW( (int(d)%100)   / 10   );
  SHOW( (int(d)%10)           );
  SHOW( (int(d*10)  % 10)     );
  SHOW( (int(d*100) % 10)     );
  SHOW( (int(d*1000)% 10)     );

  SHOW( log(d)/log(10) );
}

Bien que vous deviez utiliser static_cast ...

Attention à la notation exponentielle. Avec un très petit ou un très petit nombre, vous pouvez avoir un problème.

Les nombres à virgule flottante posent également des problèmes qui peuvent vous causer du chagrin. (C’est la même raison pour laquelle nous n’utilisons pas opérateur == entre deux doubles. Ou pourquoi vous ne pouvez pas compter sur a * b == b * a. Selon les valeurs exactes de a & b, elles peuvent être très différentes. légèrement en dehors autour de 10 ^ -25.)

Vous pouvez lancer entre chaîne et float uniquement en utilisant boost :: lexical_cast. Toutefois, vous ne pouvez pas indexer directement le formulaire flottant - il n’est pas stocké en interne sous forme de chiffres décimaux. Ce n'est probablement pas un problème. De toute façon, pour votre interface utilisateur, vous conserverez probablement une forme de chaîne du nombre, avec des conversions vers et depuis float dans le getter / setter.

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