0

Lua では、任意の数値に対して type 関数を使用すると、常に「数値」が返されます。Lua インタープリターが数値型に 32 ビット浮動小数点数、64 ビット倍精度浮動小数点数、整数などを使用しているかどうかを示す関数はありますか?

私はこのような関数を書き込もうとしました:

function numbertype()
  local rational = 5 / 2

  if rational == 2 then
    -- equals 2
    return 'int'
  else
    -- about 2.5
    return 'double' -- but could it be a 32 bit float or something else?
  end
end

print(numbertype())

float、double、および不明な型の違いをまだ検出できません。Lua の数値型が Lua のインタープリターで int、float、または double と同等かどうかを確認するにはどうすればよいですか? 純粋な Lua で動作するようにしたいと思います。

4

4 に答える 4

5

Pure Lua は、インタプリタにそのようなことを問い合わせることはできません。インタープリターがさまざまな型を使用できるかどうかは非常に自由な形式であるため (任意の浮動小数点型または整数型を選択できます)、これを Lua に公開する唯一の方法は、可能なすべての型の数値を予測するようにインタープリターをコーディングすることです。コンパイルできること。

一般的に、気にする必要はありません。double 以外のものを使用するアプリケーションは、せいぜいまれです。ARM とその恐ろしい浮動小数点演算に対処しなければならない LuaJIT でさえ、最適化として整数演算を効果的に使用する能力を隠しています。Lua コードでは違いがわかりません。

これはあるべき姿です。

于 2012-10-13T01:55:33.200 に答える
1

Lua 5.1 Reference Manualによると、数値は倍精度浮動小数点数のみです。別のタイプを使用するには、Lua を変更して再コンパイルする必要がありますluaconf.h

于 2012-10-13T01:33:58.293 に答える
0

catwell のコメントの役立つ情報源から、バイトコード ヘッダーに基づいて数値型を返すことができる関数を作成しました。この関数は便利ですが、特定のインタープリターでしか機能しないため、決して使用しないでください。lua 5.2 または luajit 用に完全に書き直す必要があり、コードの再利用に不必要な負担が生じます。

代わりに、lua スクリプトは、使用するインタープリターまたは数値型とは無関係に作成する必要があります。

完全を期すために、ここに関数があります:

-- only work in Lua 5.1
function numbertype()
  local headertypes = {
    ['\4\1'] = 'int32',
    ['\8\1'] = 'int64',
    ['\4\0'] = 'float32',
    ['\8\0'] = 'float64'}

  -- returns nil if the type is something else
  return headertypes[string.dump(function () end):sub(11,12)]
end
于 2012-10-24T00:06:17.020 に答える
0

おそらく、次の回避策を使用できます。number%1 を計算します。余りが 0 の場合は、整数のようなものである可能性が最も高いです。

于 2012-10-14T08:42:38.887 に答える