web-dev-qa-db-ja.com

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

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

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

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

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

8
Niklas Vest

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

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

最初のgotoの選択肢であるDEC64が妥当であるように見えるため、一部の表現がおそらくより良いことは事実です。これは10進浮動小数点表現であるため、ほとんどの場合、IEEE-754(2進浮動小数点)ほど驚くことはありません。 0.3を正確に表すことができます。いくつかの状況では、それでも表現の問題があります。本当に大きな数字と本当に小さな数字を足し合わせる

詳細については、Richard Harrisの一連の記事「なぜXが浮動小数点ブルースを修正しないのか」をお勧めします

11
jk.

一般的な言語では、数値は数学のクラスで教えられているように動作するはずです。デバイスドライバー用のような特殊目的の言語のみ、特殊な数学を使用する必要があります。

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

2
shawnhcorey