2010-10-13 5 views
1

Je sais que la plupart des langages de programmation ont des fonctions intégrées pour faire cela pour vous, mais comment fonctionnent ces fonctions?comment convertir un double en une chaîne?

+4

Il se fait différemment dans chaque langue, je dirais donc qu'il est très _dependent_ de langue, pas agnostique. – Oded

Répondre

0

Un simple (mais de façon non générique, naïve et lente):

  • convertir le nombre à un nombre entier, puis diviser cette valeur par 10 étapes pour trouver ses chiffres dans l'ordre inverse. Concaté les ensemble et vous avez la représentation entière.
  • soustrayez l'entier du nombre d'origine, multipliez maintenant par 10 pas à pas et trouvez les chiffres après le point décimal. Concatène la première chaîne avec un point et cette deuxième chaîne.

Cela a quelques problèmes, bien sûr:

  • lent comme l'enfer;
  • ne fonctionne pas pour les nombres négatifs;
  • ne vous donnera pas de notation exponentielle pour les nombres très petits ou grands.

Dans l'ensemble, c'est une idée, mais pas une très bonne idée; Je soupçonne qu'il n'y a pas de langages de programmation qui le font.

+0

J'ai vu du code C qui ne fait que lancer un double et accéder directement aux bits. (Si je me souviens bien, c'était la fameuse fonction invsqrt() optimisée du moteur Quake). Mais le problème est, que vous auriez à traiter tous ces cas de frontière (NaN, Inf, etc.) directement et la spécification n'est pas si courte à lire/implémenter;) – tux21b

-1

Comme Oded mentionné dans un commentaire, différentes langues le feront de différentes manières. A titre d'exemple, here's how Ruby 1.9 does it (en C). Votre meilleur pari, tout comme un exercice de recherche, sera de se pencher sur les langages open-source et de voir comment ils le font.

+0

Donc Ruby appelle fondamentalement printf, ce qui est à peine la langue agnostique. – Jess

2

Le javadoc sur la méthode Double toString() est assez complet:

Crée une représentation de chaîne de la double argument. Tous les caractères mentionnés ci-dessous sont des caractères ASCII.

  • Si l'argument est NaN, le résultat est la chaîne "NaN".
  • Sinon, le résultat est une chaîne qui représente le signe et la magnitude (valeur absolue) de l'argument. Si le signe est négatif, le premier caractère du résultat est '-' ('-'); si le signe est positif, aucun caractère de signe n'apparaît dans le résultat. En ce qui concerne la grandeur m:
  • Si m est l'infini, il est représenté par les caractères "Infinity"; ainsi, l'infini positif produit le résultat "Infini" et l'infini négatif produit le résultat "-Infinité".
  • Si m vaut zéro, il est représenté par les caractères "0.0"; ainsi, le zéro négatif produit le résultat "-0.0" et le zéro positif produit le résultat "0.0". Si m est supérieur ou égal à 10^-3 mais inférieur à 10^7, alors il est représenté comme la partie entière de m, sous forme décimale sans zéros, suivi de '.' (.), suivi d'un ou plusieurs chiffres décimaux représentant la partie fractionnaire de m.
  • Si m est inférieur à 10^-3 ou supérieur à 10^7, alors il est représenté sous la forme d'une "notation scientifique informatisée". Soit n l'entier unique tel que 10^n < = m < 10^(n + 1); alors soit a le quotient mathématiquement exact de m et 10^n de sorte que 1 < = a < 10. La grandeur est alors représentée comme la partie entière de a, sous la forme d'un seul chiffre décimal, suivi de '.' (.), suivi de chiffres décimaux représentant la partie fractionnaire de a, suivi de la lettre 'E' (E), suivie d'une représentation de n sous la forme d'un nombre décimal entier, tel que produit par la méthode Integer.toString (int).

Combien de chiffres doivent être imprimés pour la partie fractionnaire de m ou a? Il doit y avoir au moins un chiffre pour représenter la partie fractionnaire, et au-delà autant, mais seulement autant, plus de chiffres que nécessaire pour distinguer de façon unique la valeur de l'argument des valeurs adjacentes de type double. C'est-à-dire, supposons que x est la valeur mathématique exacte représentée par la représentation décimale produite par cette méthode pour un argument fini non nul d. Alors d doit être la valeur double la plus proche de x; ou si deux valeurs doubles sont également proches de x, alors d doit être l'une d'elles et le bit le moins significatif du d doit être 0.

Est-ce suffisant? Sinon, vous pouvez aussi rechercher la mise en œuvre ...

Questions connexes