Tout point flottant binaire peut être formaté exactement en décimal. La chaîne résultante peut être quelque peu longue, mais c'est possible. Dans mon article sur la virgule flottante, je couvre l'importance de la précision, et maintenant je veux cette fonction. Ce défi consiste à écrire un programme ou une fonction qui prend une valeur à virgule flottante en entrée et formate une chaîne décimale exacte en sortie.
Pour nous assurer que nous travaillons avec les bons nombres à virgule flottante, un format précis doit être fourni en entrée du programme. Ce format sera deux entiers Significand Exponent
, où la valeur réelle en virgule flottante est Significand * 2 ^ Exponent
. Notez que l'une ou l'autre valeur peut être négative.
Détails:
- La plage et la précision d'au moins un flottant de 32 bits doivent être prises en charge (aucune entrée n'ira au-delà de cela)
- La valeur formatée décimale doit être une représentation exacte (simplement assez proche pour garantir un retour en rond correct pour flotter n'est pas assez bon)
- Nous ne faisons pas confiance aux fonctions de formatage à virgule flottante de la bibliothèque standard pour être suffisamment correctes ou assez rapides (ex:)
printf
, et donc elles ne peuvent pas être utilisées. Vous devez faire le formatage. Les fonctions de formatage / conversion intégrées sont autorisées. - Il ne peut pas y avoir de zéros de tête ou de fin, à l'exception du zéro de tête requis devant le
.
s'il n'y a pas de composant de nombre entier - Une fonction ou un programme entier est autorisé.
Exemples:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
Le code le plus court gagne.
la source
.0
?0.abc
n'est pas un zéro de début, alors ceabc.0
n'est pas un zéro de fin..0
des nombres entiers lorsqu'il s'agit de nombres à virgule flottante. Voir par exemple Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Votre logique est toujours incohérente.Réponses:
CJam, 43
Essayez-le en ligne
Explication:
Le programme fonctionne avec des exposants jusqu'à ± 999, près de la double précision (64 bits). Il sépare le signe moins (s'il est présent) de la signification, le multiplie par 10 999 puis effectue un décalage de bit avec l'exposant, qui est maintenant un calcul exact. Il remplit ensuite vers la gauche avec des zéros si le résultat a moins de 1000 chiffres, sépare les 999 derniers chiffres comme partie fractionnaire, supprime les zéros de fin en convertissant son inverse en entier, ajoute un point décimal si nécessaire et remet tout en place.
À la fin, le signe moins (le cas échéant) et la chaîne finale sont automatiquement imprimés ensemble.
la source
CJam, 50 octets
Il s'agit d'un programme complet qui lit à partir de STDIN. Essayez-le en ligne dans l' interpréteur CJam .
Vérifiez tous les cas de test à la fois.
la source
GNU sed + dc, 65
Le score inclut +1 pour l'
-r
option de sed .J'ai été tenté de réclamer cette
dc
seule réponseC8k& 2r^*p
pour un score de 10, mais j'aidc
quelques bizarreries de mise en forme:_
au lieu de-
|n| < 1
doit être ajoutéAinsi, l'expression dc est encapsulée et évaluée par
sed
pour prendre soin de ce qui précède.Sortie de test:
la source
dc
genre de violation de ma règle sur l'utilisation d'une fonction de formatage standard.dc
ok était autorisée, étant donné que "l'arithmétique de précision fixe illimitée ou élevée est autorisée" .dc
Lap
commande n'est pas une " fonction de formatage à virgule flottante" - c'est une fonction d'impression de précision arbitraire. Je mets la précision à 128 décimales (C8k
), ce qui, je pense, est plus que suffisant pour n'importe quel flotteur 32 bits.