3

非常に単純な質問ですが、私は本当に混乱しています:P

> for x = 0, 5, 0.2 do
print (x)
end

このループは 4.8 までしかカウントされません (0.2 で 1 ステップ多くすると、正確に 5 になりますよね?)

しかし、次の for ループは 5 までカウントされます

> for x = 0, 5, 1 do
print (x)
end

これらの出力の背後にある理由について、誰かがマニュアルを説明または参照できますか。たぶん、変数をfloatとして定義する必要がありますか?

4

4 に答える 4

4

Lua は通常、数値をieee754 binary64形式で表します (「通常」は、表現が実際には基礎となる C 実装に依存するためです)。binary64 で に最も近い数値は、またはおよそです。0.20x3FC999999999999A0.200000000000000011102230246252

0.2ソース コード内の は、計算が行われる前にこの数値に丸められます。

0.200000000000000011102230246252は よりも大きいため、最後のステップで2は数値が大きくなり5、約 でループが終了します4.8

于 2013-09-27T06:58:05.663 に答える
3
for x = 0, 5, 0.2 do print (x) end

この数値forループは、ステップ0.2を初期値0に追加し、値が になるまで処理 ( print(x)) を行います<=5。問題は、浮動小数点数の場合、0.2正確に表すことができないため、丸めが少し発生することです。したがって、合計すると になると考えると5、おそらく少し大きくなります。

それほど大きくない整数の場合、倍精度浮動小数点数で正確に表現できるため、問題ありません。


Lua を学ぶ最初の日に、ちょっとしたヒント:

  • LUA や lua ではなく、Luaを言語名として使用します。
  • Lua には数値型が 1 つしかありません。つまりdouble、デフォルトです。* 下記参照

*:これはもはや真実ではありません。Lua 5.3 では、数値の新しい整数サブタイプが導入されました。言語の変更を見る

于 2013-09-27T06:54:55.727 に答える