2

これが非常に素朴な質問かもしれないことはわかっていますが、私は Scala や他の同様の言語に慣れていないため、これは当然のことながら私を困惑させます。

なぜ Scala (および他の言語) には、整数と double に対して 2 つの異なるクラスがあるのですか? 整数は floats(1.0 = 1)にあるのに、わざわざ Int クラスを使用する必要はありません。

1.00000000002 != 1一部の整数が浮動小数点数に決して変更されないようにしたい場合や、最初の数桁しか表示されないと混乱する可能性があるのような出現を防止したい場合があることは、ある程度理解していますが、他に根本的なものはありますか?私が行方不明であることの正当化?

ありがとう!

4

3 に答える 3

3

整数は、ソフトウェアの内部動作にとって重要です。多くのものが、必ずしも「数値」とは考えられない整数として内部的に実装されているためです。たとえば、メモリ アドレスは一般に整数で表されます。個々の 8 ビット バイトは、一般に 1 バイトの整数と見なされます。および文字 (ASCII 文字や Unicode 文字など) は通常、整数値のコードポイントによって識別されます。(ちなみに、これらすべてのケースで、まれにそれらを表示したい場合、通常は 16 進表記を使用します。これは、8 ビット バイトごとに正確に 2 文字を使用するため便利です。) もう 1 つの重要なケースは、通常は次のとおりです。プログラミングの外でも数値として考えられているのは、配列インデックスです。数学でも、長さ 3 の配列には 1、2、および 3 の番号が付けられた要素があります (ただし、プログラミングでは、Scala を含む多くの言語が代わりにインデックス 0、1、および 2 を使用します。マッピングの基礎となるスキームが原因である場合があります)。メモリアドレスへのインデックス、および古い言語がこの理由でそうすることに関連する歴史的な理由による場合があります)。

より一般的に言えば、コンピューティング (および現実世界) の多くのことは厳密に量子化されています。「 2.4テーブル行」や「2.4 ループ反復」と書くのは意味がないので、算術演算が正確で、正確な整数量を表すデータ型を持つと便利です。

しかし、その区別が絶対に不可欠というわけではないというあなたの意見は正しいです。Perl、JavaScript、Tcl などの多くのスクリプト言語では、整数と浮動小数点数の明示的な区別がほとんど省略されています (ただし、必要に応じて暗黙的に変換が行われるため、インタプリタの動作で区別が行われることがよくあります)。 . たとえば、JavaScript では、typeof 3typeof 3.0は両方とも'number'.

于 2013-09-07T01:50:21.023 に答える
3

整数は、正確な表現を持っているため、一般に操作がはるかに簡単です。これはソフトウェア レベルだけでなく、ハードウェア レベルでも同様です。たとえば、x86 アーキテクチャについて説明しているこのソースを見ると、浮動小数点の加算は通常、整数の加算よりも 4 倍の時間がかかります。そのため、パフォーマンス上の理由と使いやすさの理由から、2 つのタイプの操作を分離することが有利です。

于 2013-09-07T02:06:33.617 に答える
0

他の2つの答えに加えて、整数は実際には浮動小数点数ではありません。つまり、float で正確に表現できない整数がいくつかあります。

scala> Int.MaxValue.toFloat == (Int.MaxValue - 1).toFloat
res0: Boolean = true

ロングもダブルスも同じ。

于 2013-09-07T15:24:16.667 に答える