私自身のプログラミングを覚えている限り、浮動小数点数が等しいかどうか比較しないように教えられました。ここで、Lua number
タイプについて Luaでのプログラミング を読んでいるときに、次のことがわかりました。
数値型は、実数(倍精度浮動小数点)数を表します。 Luaは整数型を必要としないため、整数型はありません。浮動小数点の算術エラーについては広く誤解されており、単純な増分でさえ浮動小数点数で奇妙になる可能性があると恐れている人もいます。実は、doubleを使用して整数を表す場合、丸め誤差はまったくありません(数値が100,000,000,000,000を超えない限り)。具体的には、Lua数は丸めの問題なしに任意の長整数を表すことができます。さらに、ほとんどの最近のCPUは、浮動小数点演算を整数演算と同じくらい(またはそれよりもさらに高速)に実行します。
それはすべての言語に当てはまりますか?基本的に、doubleの浮動小数点を超えなければ、整数演算で安全ですか?または、質問のタイトルと一致するように、Luaがnumber
型で特別なことをしているので、整数型と浮動小数点型の両方として正常に機能していますか?
Luaは、浮動小数点数は整数型とまったく同じように整数を表すことができると主張し、私は同意する傾向があります。処理する小数値部分の不正確な表現はありません。整数を整数型に格納しても、浮動小数点数の仮数に格納しても、結果は同じです。仮数のビット数を超えない限り、整数は正確に表すことができます。 、+ 1ビットの指数。
もちろん、実際の浮動小数点数(12.345など)を浮動小数点表現に格納しようとすると、すべての賭けがオフになるので、プログラムは、数値が実際にはオーバーフローしない真の整数であることを明確にする必要があります。仮数。これを実際の整数のように扱うため(つまり、等価性の比較に関して)。
それ以上の整数精度が必要な場合は、常に 任意精度ライブラリ を使用できます。
さらに読む
Luaの数値の最大値はいくつですか?
倍精度浮動小数点数は、仮数と指数として格納されます。詳細については、 形式 を参照してください。基本的に、すべての数値は仮数* 2の形式です。指数。 2より小さい整数の場合52、指数はゼロになり、仮数はビットごとに52ビットの符号なし整数と同等になります。負の数を示すために、別の符号ビットが使用されます。
実際、2より大きい整数でも52 52を超えるすべての桁が正確である限り、正確に表すことができます。nd ゼロです。また、0.5など一部の分数は正確に表すことができます。基数2で分数が継続的に繰り返される(1/3のように)か、基数ポイントを過ぎてビット数が多すぎて精度が失われる場合のみです。