言語設計では1つの数値タイプのみ


8

私は現在、コンパイラの構築と言語設計について学び、自分の言語でサポートしたいネイティブデータ型について考えています。現在、整数と実数を区別する多くの言語があります。しかし、私は彼が言ったダグラス・クロックフォードによる講演を見たのを覚えています。

システムに単一の数値タイプがあることは、間違った数値タイプを選択してバグを発生させることができないことを意味します

彼はまた、一般的に使用されているIEEE-754とは異なる数値表現をお勧めします(間違っている場合は修正してください)。したがって、私の質問:主に教育に重点を置いている汎用言語の場合、どの数値表現を使用する必要がありますか?

編集:教育的焦点を当てて、私は他の人を教育するためではなく、コンパイラについて学ぶ私の自身の進歩について話しています。


4
ここで正解はありません。教育目的のために、任意の精度の小数を使用することをお勧めします(Java BigDecimalやBigIntegerなど)。求められるすべての柔軟性があり、最初に丸め誤差を説明する必要がなく、生徒が慣れている計算機とほとんど同じように動作します。
-marstato

5
質問は、数値タイプについて尋ね始め、数値表現に移ります。どちらかと言えば混乱しているかもしれませんが、混乱しているかもしれません。さらに、あなたが言及している教育の焦点を明確にできない場合は、意見に基づく回答でさえ、適切ではない可能性があります。それは、プログラミングを学習する人々のための言語(Pascalなど)、つまり自分のプロジェクトです教育、カウントを学習する幼児が使用する言語... ...
ハイパフォーマンスマーク

1
ありがとう、質問を編集しました。TYPESとREPRESENTATIONSの両方について言及しているのは、誰かが私の問題の両方について正しい方向を教えてくれるかもしれないと思ったからです。)
Niklas Vest

ただ1つのクラスのバグを排除できることは、必ずしもバグの正味の数が減少することを意味しないことに注意してください。
whatsisname 2018年

1
「どちらが主に教育的焦点を持っている」コンピュータサイエンス教育のように?言語設計の観点から遭遇する1つの問題は、算術シフトや論理シフトなどの二項演算子のサポートです。(これは、言語が物事をどのように処理するかを学習するために二項演算子を含める場合にも、演算子の優先順位の文法規則に関係します)。それらを気にしない場合は、単一のデータ型を使用できます。(あなたが物事を処理する奇妙な方法を見たいのであれば、JSは単一の「数値」タイプを持っています)。
Sirisian

回答:


11

速度、精度、または範囲など、長所と短所が異なるため、一般的に異なる数値表現があります。また、有限のメモリですべての実数を表すことができないため、これは当てはまります。正確に表すことができないものを常に選択する必要があります。

あなたが持っているDoug Crockfordの引用は境界線のばかげたものであり、そのため1つの表現しか選択できない場合、OKを選択することはできませんが、正しいものを選択することはできません。つまり、あなたの唯一の選択は、いくつかの用途では機能しますが、すべてでは機能しません。

最初のgotoの選択肢であるDEC64が妥当であるように見えるため、一部の表現がおそらくより優れていることは事実です。これは10進浮動小数点表現であるため、多くの場合、人々は10進数で考える傾向があるため、IEEE-754(2進浮動小数点)よりも0.3を正確に表すことができるため、それほど驚くことではありません。それはいくつかの状況でまだ表現の問題を持っています例えば本当に一緒にそして本当に小さい数を一緒に加えること

詳細については、Richard Harrisの一連の記事「なぜXがフロートポイントブルースを修正しないのか」をお勧めします


Harrisの記事へのリンクは、関連する質問softwareengineering.stackexchange.com/a/101197/10563
jk

2

一般的な言語では、数値は数学のクラスで教えられているように動作するはずです。デバイスドライバー用のような特別な目的の言語だけが特別な数学を持つべきです。

固定精度の数値ではなく、任意精度の数値を使用することをお勧めします。はい、それらはより遅いですが、人々が数が振る舞うことを期待するように振る舞います。それらに人為的な制限を設定すると、バグとして報告されます。


5
残念ながら、数学クラスのような数値は有限メモリでは表現できません。これが、そもそも非常に多くの異なる数値表現がある理由です。
イェルクWミッターク

4
また、誰かがSQRT(2.0)を計算しようとしたときに「メモリ不足」を報告することも、おそらくバグと見なされます。
Simon B

3
したがって、単一の数値型は、実際にはいくつかのパラメータに応じて無限の数値型になります。
デュプリケータ

2
@shawnhcorey:では、代わりにすべての単一の操作の精度を手動で指定する必要がありますか?
Deduplicator

2
@shawnhcoreyグローバル状態は悪です。そして今、それはすべての算術を妨害しますか?また、異なるパラメーターを持つ2つの変数はどのように相互作用しますか?
デュプリケータ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.