web-dev-qa-db-ja.com

Luaの数値の最大値はいくつですか?

ドキュメントにはこれに対する明確な答えがないようです。

プログラムが開始されてからの秒数をカウントする変数timeをインクリメントすることに興味があります。最大値が100年のようにはるか先にカウントできる場合、変数を永久にインクリメントさせてもかまいません。それ以外の場合は、timeを0にリセットするための良い点を考える必要があります。

22
Kai

デフォルトでコンパイルされるように、数値はdoubleであり、ほとんどのコンパイラではIEEE64ビット浮動小数点です。これは10ビットの指数を意味するため、最大数は約2 ^ 1024、つまり5。6e300年です。それは長い時間。

今、それをインクリメントしている場合は、整数範囲にもっと興味があるかもしれません。 52ビットの仮数は、整数精度で使用できる最大数が2 ^ 52であり、4.5e15前後であることを意味します。 31'557,600秒/年で、それは1.427e8、ほぼ1億5000万年です。それでも、どのプロセスでも非常に長い稼働時間

更新2014-12-:Lua 5.3(現在リリース予定)は、コンパイルフラグを介して選択された32ビットまたは64ビットの整数値のサポートを追加します。

28
Javier

Tydokの PiL 2. への言及は正しくて適切であり、 Javierの答え は実際には正しいですが、Luaでの数値の議論はいくつかで締めくくられるべきだと思いましたその他の情報。

Luaインタープリターは、通常、構成言語やスクリプト言語としてアプリケーションに組み込まれるように設計されています。アプリケーション用に構築する場合、その機能の一部を適切に構成するのが一般的です。

数値に使用する正確な数値タイプは、構成に使用できます。サードパーティモジュールのロードが重要ではないハードウェア浮動小数点のないプラットフォーム用にコンパイルする場合(特に組み込みシステムまたはセットトップボックスゲームコンソールアプリケーション)、デフォルトのdouble。場合によっては、floatに切り替えることも合理的です。

ただし、64ビット整数が必要なアプリケーションや、ほとんどの数値を整数にすることができるアプリケーションがありますが、浮動小数点演算が必要になる場合があります。そのような場合、Luaコアに LNUMパッチ があります。

LNUMは、数値が整数または浮動小数点として格納されるようにコアを変更し、それぞれの精度についていくつかの構成可能な選択を可能にします。

したがって、Lua数の最大値の質問に対する最終的な答えは、コンパイル時に選択したインタープリターの構成と、表現可能な最大の大きさまたは最大の整数について心配しているかどうかに依存するということです。それでも、大きな整数が浮動小数点表現でうまく機能するようにするための作業が行われています。

8
RBerteig

これは、他のいくつかの回答で言及されている最高値です。これが1.8e308の由来です。

local HighestNumber = 0
for i = 971, 1023 do
    HighestNumber = HighestNumber + (2 ^ i)
end

私は画像を投稿するのに十分な評判がありませんが、明らかにこれはシグマの合計として表すことができます。

1
Niles S

Lua5.1またはLua5.2を使用

フォーマットされた最大数:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

最後に68を69に変更しても、68しか表示されません。上記の数値よりも大きい数値はmath.huge akainfを返します。

これは、1.8x10 ^ 308または2 ^ 1024のすぐ南に相当します。

自分で試してみてください:

print(string.format("%.0f",number))
0
Mossarelli

私は見つけました このメール luaユーザーサイトで

Luaコアは、暗黙的にsize_tまたはptrdiff_t(64ビットボックスでは64ビット)を介する場合を除いて、64ビットデータ型を使用しません。

sizeof(float)== 4
sizeof(double)== 8

Lua_Numberは、double(デフォルト)、float、または少なくとも32ビットの任意の整数として定義できます。ただし、副作用があり、floatまたはintの範囲が限られているため、一部の拡張機能が機能しなくなる場合があります。ただし、コアは問題ないはずです。

0
Ólafur Waage