Luaは整数と浮動小数点数の両方をどのように処理しますか?


11

私がプログラミングを覚えている限り、浮動小数点数を比較して平等にしないように教えられました。今、LuaのプログラミングについてLua を読んでいるとnumber、次のことがわかりました。

数値型は、実数(倍精度浮動小数点数)を表します。Luaには整数型は必要ありません。浮動小数点演算エラーについては誤解が広まっており、一部の人々は、単純な増分でさえ浮動小数点数で奇妙になることがあると恐れています。実際、整数を表すためにdoubleを使用すると、丸め誤差はまったくありません(数値が100,000,000,000,000を超えない限り)。具体的には、Lua数値は、丸めの問題なしで任意の長整数を表すことができます。さらに、最新のCPUのほとんどは、整数演算と同程度(またはそれ以上)の浮動小数点演算を実行します。

それはすべての言語に当てはまりますか?基本的に、倍精度浮動小数点を超えない場合、整数演算で安全ですか?または、質問のタイトルに沿って、Luaがそのnumberタイプで行う特別なことはありますか?整数型と浮動小数点型の両方としてうまく機能していますか?



@JoonasPulakkaありがとう、それは非常に貴重な追加です。
ペトルアブドゥリン

回答:


10

Luaは、浮動小数点数は整数型とまったく同じように整数を表現できると主張しており、私も同意する傾向があります。対処する小数部分の不正確な表現はありません。整数を整数型に格納する場合でも、浮動小数点数の仮数に格納する場合でも、結果は同じです。仮数のビット数を超えない限り、その整数は正確に表現できます。 、+ 1ビットの指数。

もちろん、実際の浮動小数点数(12.345など)を浮動小数点表現で保存しようとすると、すべての賭けはオフになるため、プログラムは、数値が実際にオーバーフローしない真の整数であることを明確にする必要があります仮数、それを実際の整数のように扱うため(つまり、等値の比較に関して)。

それ以上の整数精度が必要な場合は、いつでも任意精度ライブラリを使用できます

さらに読む
Luaの数値の最大値は?


2番目の引数、つまり、浮動小数点は最新のCPUの整数演算と同じかそれより速いということはどうでしょうか?浮動小数点数を使用して整数演算を実行する場合でも、私には疑わしいようです。
アンドレスF.

2
@AndresF。2つではなく1つの数値型を使用してキャストを削除しない限り、どのように高速になるかわかりません。
ロバートハーヴェイ

同意した。私には意味がありません。それは...文脈から取り出さだのだろうか
アンドレスF.を

1
十分に大きな整数浮動小数点オブジェクトに正確に格納することはできません。64ビットにdoubleは、約51桁の仮数ビットがあります。約2 ** 51より大きい奇数の整数には丸め誤差があります。64ビット整数は、指数にビットを割り当てないため、より大きな整数値を正確に格納できます。
キーストンプソン

@KeithThompson:「仮数に格納されています」と言ったとき、それが私の答えに含まれていると思いました。ただし、回答を編集して明確にします。
ロバートハーヴェイ

5

doubleは仮数と指数として保存されます。詳細については、形式を参照しください。基本的に、すべての数値は仮数* 2 指数の形式です。2 52より小さい整数の場合、指数はゼロになり、仮数部はビット単位で52ビットの符号なし整数と同等になります。負の数を示すために、別個の符号ビットが使用されます。

実際、52 番目以降のすべての数字がゼロである限り、2 52より大きい整数でも正確に表すことができます。また、0.5などの一部の分数は正確に表すことができます。基数2で分数が連続して(1/3のように)繰り返されている場合、または基数ポイントを超えるビットが必要な場合にのみ精度が失われます。


小数が連続的に繰り返されるためではありません。これは、多くの10進数(10進数)が2のべき乗として正確に表現できないためです。
ロバートハーヴェイ

2
ベース2には、正確に表現することができない番号があろう繰り返し連続的です。たとえば、0.1の小数は2進数で0.0(0011)になり、0011は連続して繰り返されます。
カールビーレフェルト

2
はい、正確に。しかし、ベース2に繰り返しベース10には繰り返しません
ロバート・ハーヴェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.