Eine Sache, die ich gerne sehen würde, wäre die Erkenntnis, dass double
to float
als eine zunehmende Konversion angesehen werden sollte, während float
to double
sich verengt (*). Das mag kontraintuitiv erscheinen, aber überlegen Sie, was die Typen tatsächlich bedeuten:
- 0,1f bedeutet "13.421.773,5 / 134.217.728, plus oder minus 1 / 268.435.456 oder so".
- 0,1 bedeutet wirklich 3,602,879,701,896,397 / 36,028,797,018,963,968, plus oder minus 1 / 72,057,594,037,927,936 oder so.
Wenn man ein hat, double
das die beste Darstellung der Größe "ein Zehntel" enthält und in float
umrechnet, ist das Ergebnis "13.421.773,5 / 134.217.728, plus oder minus 1 / 268.435.456 oder so", was eine korrekte Beschreibung des Wertes ist.
Im Gegensatz float
dazu double
ist das Ergebnis "13.421.773,5 / 134.217.728, plus oder minus 1 / 72.057.594.037.927.936 oder so" - ein Grad an impliziter Genauigkeit , wenn a die beste Darstellung der Menge "ein Zehntel" enthält und in diese umwandelt das ist falsch um einen Faktor von über 53 Millionen.
Obwohl der IEEE-744-Standard verlangt, dass Gleitkomma-Berechnungen so durchgeführt werden, als ob jede Gleitkommazahl die exakte numerische Größe genau in der Mitte ihres Bereichs darstellt, sollte dies nicht bedeuten, dass die Gleitkomma-Werte tatsächlich diese exakten Werte darstellen numerische Größen. Das Erfordernis, dass die Werte in der Mitte ihrer Bereiche angenommen werden, ergibt sich vielmehr aus drei Tatsachen: (1) Berechnungen müssen so durchgeführt werden, als ob die Operanden einige bestimmte genaue Werte haben; (2) konsistente und dokumentierte Annahmen sind hilfreicher als inkonsistente oder undokumentierte Annahmen; (3) Wenn man eine konsistente Annahme machen will, kann keine andere konsistente Annahme besser sein als die Annahme, dass eine Menge das Zentrum ihres Bereichs darstellt.
Ich erinnere mich übrigens an ungefähr 25 Jahre zuvor, als jemand ein numerisches Paket für C erfand, das "Range Types" verwendete, die jeweils aus einem Paar 128-Bit-Floats bestanden. Alle Berechnungen würden so durchgeführt, dass für jedes Ergebnis der minimal und maximal mögliche Wert berechnet wird. Wenn man eine große lange iterative Berechnung durchführt und einen Wert von [12.53401391134 12.53902812673] feststellt, kann man sicher sein, dass viele Stellen der Genauigkeit durch Rundungsfehler verloren gegangen sind, das Ergebnis aber immer noch vernünftigerweise als 12,54 ausgedrückt werden kann (und es war nicht ' t wirklich 12,9 oder 53,2). Ich bin überrascht, dass ich keine Unterstützung für solche Typen in gängigen Sprachen gesehen habe, zumal sie gut zu mathematischen Einheiten passen, die mit mehreren Werten gleichzeitig arbeiten können.
(*) In der Praxis ist es oft hilfreich, Werte mit doppelter Genauigkeit zu verwenden, um Zwischenberechnungen durchzuführen, wenn mit Zahlen mit einfacher Genauigkeit gearbeitet wird. Daher kann es ärgerlich sein, für alle derartigen Vorgänge einen Typecast zu verwenden. Sprachen könnten helfen, indem sie einen "Fuzzy Double" -Typ haben, der Berechnungen als Double ausführt und frei von und nach Single umgewandelt werden kann. Dies wäre besonders hilfreich, wenn Funktionen, die Parameter vom Typ double
und vom Rückgabewert annehmen double
, markiert werden könnten, damit sie automatisch eine Überladung erzeugen, die stattdessen "Fuzzy Double" akzeptiert und zurückgibt.