Nur ein Nummerntyp im Sprachdesign

8

Ich lerne gerade etwas über Compilerkonstruktion und Sprachdesign und denke darüber nach, welche nativen Datentypen ich in meiner Sprache unterstützen möchte. Jetzt gibt es eine ganze Reihe von Sprachen, die zwischen ganzzahligen und reellen Zahlen unterscheiden. Ich erinnere mich jedoch an einen Vortrag von Douglas Crockford, in dem er sagte:

Wenn Sie einen einzelnen Nummerntyp im System haben, können Sie keinen Fehler machen, indem Sie den falschen Nummerntyp auswählen

Er erwähnte auch, dass er eine andere Zahlendarstellung als die häufig verwendete IEEE-754 empfiehlt (bitte korrigieren Sie mich, wenn ich falsch liege), und zwar als DEC64. Daher meine Frage: Welche Zahlendarstellung sollte ich für eine Allzwecksprache mit primär pädagogischem Schwerpunkt verwenden?

EDIT: Mit pädagogischem Fokus spreche ich über meine eigenen Fortschritte beim Erlernen von Compilern, nicht um andere zu erziehen.

Niklas Weste
quelle
4
Hier gibt es keine richtige Antwort. Für Bildungszwecke würde ich die Verwendung von Dezimalstellen mit beliebiger Genauigkeit empfehlen (z. B. Javas BigDecimal und BigInteger). Hat alle Flexibilität, die man sich wünschen kann, vermeidet es, Rundungsfehler gleich zu Beginn erklären zu müssen und verhält sich sehr ähnlich wie die Taschenrechner, an die die Schüler gewöhnt sind.
Marstato
5
Die Frage beginnt fragte nach Anzahl Typen dann veers Anzahl Darstellungen . Was irgendwie verwirrend ist, möglicherweise auch verwirrt. Darüber hinaus sind selbst meinungsbasierte Antworten wahrscheinlich falsch, wenn Sie den von Ihnen erwähnten Bildungsschwerpunkt nicht klarstellen können: Ist es eine Sprache für Menschen, die Programmieren lernen (wie Pascal), ein Projekt für sich selbst? Bildung, eine Sprache, in der die Kleinen das Zählen lernen, ...?
Hochleistungsmarke
1
Danke, ich habe die Frage bearbeitet. Ich erwähne sowohl die Nummer TYPEN als auch die VERTRETUNGEN, weil ich dachte, vielleicht könnte mich jemand für meine beiden Probleme in die richtige Richtung weisen :)
Niklas Vest
Denken Sie daran, dass die Beseitigung einer Fehlerklasse nicht unbedingt bedeutet, dass Ihre Netto-Fehleranzahl sinkt.
Whatsisname
1
"Was hat einen primär pädagogischen Schwerpunkt?" Wie Informatikunterricht? Ein Problem, auf das Sie vom Standpunkt des Sprachdesigns aus stoßen werden, ist die Unterstützung von Binäroperatoren wie arithmetischen und logischen Verschiebungen. (Dies spielt auch bei Grammatikregeln mit Vorrang für Operatoren eine Rolle, wenn Sie binäre Operatoren einschließen, um zu lernen, wie Sprachen mit Dingen umgehen.) Wenn Sie sich nicht für diese interessieren, können Sie einen einzelnen Datentyp verwenden. (JS hat einen einzelnen "Zahlentyp", wenn Sie eine seltsame Art und Weise sehen möchten, mit Dingen umzugehen).
Sirisian

Antworten:

11

Wir haben im Allgemeinen unterschiedliche Zahlendarstellungen, weil sie unterschiedliche Stärken und Schwächen haben, sei es Geschwindigkeit, Präzision oder Reichweite. Dies muss auch der Fall sein, weil wir nicht alle reellen Zahlen mit endlichem Speicher darstellen können. Wir müssen immer einige auswählen, die wir nicht genau darstellen können.

Das Zitat von Doug Crockford, das Sie haben, ist grenzwertig idiotisch. Wenn Sie dann nur eine Darstellung auswählen können, können Sie nicht die falsche, aber auch nicht die richtige auswählen. Das heißt, Ihre einzige Wahl funktioniert für einige Zwecke, aber nicht für alle.

Es ist wahr, dass einige Darstellungen wahrscheinlich besser sind, da die erste Wahl von DEC64 hier vernünftig aussieht. Da es sich um eine dezimale Gleitkommadarstellung handelt, ist dies in den meisten Situationen weniger überraschend als IEEE-754 (binäres Gleitkomma), da die Leute dazu neigen, dezimal zu denken, z. B. kann es genau 0,3 darstellen. Unter bestimmten Umständen treten immer noch Repräsentationsprobleme auf, z. B. das Hinzufügen von wirklich großen und wirklich kleinen Zahlen

Für die weitere Lektüre würde ich Richard Harris 'Artikelserie vorschlagen,' warum X Sie nicht dazu bringt, Floting Point Blues zu reparieren '

jk.
quelle
Links zu Harris 'Artikeln finden Sie in dieser Antwort auf eine verwandte Frage softwareengineering.stackexchange.com/a/101197/10563
jk.
2

Für eine allgemeine Sprache sollten sich Zahlen wie im Mathematikunterricht verhalten. Nur spezielle Sprachen, wie die für Gerätetreiber, sollten über spezielle Mathematik verfügen.

Ich würde empfehlen, Zahlen mit beliebiger Genauigkeit anstelle von Zahlen mit fester Genauigkeit zu verwenden. Ja, sie sind langsamer, aber sie verhalten sich so, wie die Leute erwarten, dass sich Zahlen verhalten. Das Setzen künstlicher Grenzen wird als Fehler gemeldet.

shawnhcorey
quelle
5
Leider können Zahlen wie die im Mathematikunterricht nicht im endlichen Speicher dargestellt werden, was der ganze Grund ist, warum wir überhaupt so viele verschiedene Zahlendarstellungen haben.
Jörg W Mittag
4
Und das Melden von "nicht genügend Speicher", wenn jemand versucht, SQRT (2.0) zu berechnen, wird wahrscheinlich auch als Fehler angesehen.
Simon B
3
Ihr einzelner Nummerntyp ist also in Wirklichkeit eine Unendlichkeit von Nummerntypen, abhängig von einigen Parametern.
Deduplikator
2
@shawnhcorey: Sie möchten also stattdessen die Genauigkeit für jede einzelne Operation manuell festlegen?
Deduplikator
2
@shawnhcorey Globaler Zustand ist böse. Und jetzt stört es alle Arithmetik? Wie würden zwei Variablen mit unterschiedlichen Parametern interagieren?
Deduplikator