Jeder binäre Gleitkomma kann exakt dezimal formatiert werden. Die resultierende Zeichenfolge ist möglicherweise etwas lang, aber möglich. In meinem Artikel über Gleitkomma gehe ich auf die Bedeutung der Präzision ein und möchte nun diese Funktion. Diese Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die einen Gleitkommawert als Eingabe verwendet und eine exakte Dezimalzeichenfolge als Ausgabe formatiert.
Um sicherzustellen, dass wir mit den richtigen Gleitkommazahlen arbeiten, muss ein genaues Format als Eingabe für das Programm bereitgestellt werden. Dieses Format besteht aus zwei Ganzzahlen Significand Exponent
, wobei der tatsächliche Gleitkommawert ist Significand * 2 ^ Exponent
. Beachten Sie, dass jeder Wert negativ sein kann.
Besonderheiten:
- Der Bereich und die Genauigkeit von mindestens einem 32-Bit-Float müssen unterstützt werden (keine Eingabe geht darüber hinaus).
- Der dezimal formatierte Wert muss eine exakte Darstellung sein (einfach nah genug, um zu gewährleisten, dass eine korrekte Rundspitze zum Schweben nicht gut genug ist).
- Wir vertrauen nicht darauf, dass Standard-Gleitkomma-Formatierungsfunktionen für Bibliotheken korrekt genug oder schnell genug sind (z. B. :)
printf
, und daher werden sie möglicherweise nicht verwendet. Sie müssen die Formatierung vornehmen. Integrierte Formatierungs- / Konvertierungsfunktionen sind zulässig. - Es dürfen keine führenden oder nachfolgenden Nullen vorhanden sein, außer der erforderlichen führenden Null vor der,
.
wenn keine Ganzzahlkomponente vorhanden ist - Eine Funktion oder ein ganzes Programm ist zulässig.
Beispiele:
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
Der kürzeste Code gewinnt.
quelle
.0
?0.abc
es sich nicht um eine führende Null handelt,abc.0
handelt es sich nicht um eine nachfolgende Null ..0
bei Gleitkommazahlen immer mit ganzen Zahlen zu enden . Siehe zum Beispiel Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Ihre Logik ist immer noch inkonsistent.Antworten:
CJam, 43
Probieren Sie es online aus
Erläuterung:
Das Programm arbeitet mit Exponenten bis zu ± 999, nahezu doppelter Genauigkeit (64 Bit). Es trennt das Minuszeichen (falls vorhanden) vom Signifikanten, multipliziert es mit 10 999 und führt dann eine Bitverschiebung mit dem Exponenten durch, was nun eine exakte Berechnung ist. Es füllt dann links mit Nullen auf, wenn das Ergebnis weniger als 1000 Stellen hat, trennt die letzten 999 Stellen als Bruchteil, entfernt nachfolgende Nullen durch Konvertieren der Umkehrung in eine Ganzzahl, fügt bei Bedarf einen Dezimalpunkt hinzu und setzt alles wieder zusammen.
Am Ende werden das Minuszeichen (falls vorhanden) und die endgültige Zeichenfolge automatisch zusammen gedruckt.
quelle
CJam, 50 Bytes
Dies ist ein vollständiges Programm, das aus STDIN liest. Probieren Sie es online im CJam-Interpreter aus .
Überprüfen Sie alle Testfälle gleichzeitig.
quelle
GNU sed + dc, 65
Die Punktzahl beinhaltet +1 für die
-r
Option von sed .Ich war versucht, diese
dc
einzige AntwortC8k& 2r^*p
für eine Punktzahl von 10 zu beanspruchen , habe aberdc
einige Formatierungsprobleme:_
anstelle von-
|n| < 1
muss hinzugefügt werdenDer DC-Ausdruck wird also umwickelt und ausgewertet
sed
, um das oben Gesagte zu erledigen .Testausgabe:
quelle
dc
verstößt gegen meine Regel zur Verwendung einer Standardformatierungsfunktion.dc
ok ist, wenn "unbegrenzte oder hochpräzise Arithmetik erlaubt ist" .dc
Derp
Befehl ist keine " Gleitkomma-Formatierungsfunktion", sondern eine Druckfunktion mit beliebiger Genauigkeit. Ich setze die Genauigkeit auf 128 Dezimalstellen (C8k
), was meiner Meinung nach für jeden 32-Bit-Float mehr als ausreichend ist.