2017-12-12 15 views
0

127.0.0.1:7501>評価 "リターン{1,2,9223372036854775807}" 0
1)(整数)1
2)(整数)2を扱う場合evalは間違った値を返します
3)(整数)-9223372036854775808
のRedisのLUA - はLong.MAX_VALUE

この奇妙な動作を助けてください。私は、luaはある精度を失うことによって、10^15を超える数だけしか表現できないことを知っていました。 私は、 "9.2233720368548e + 18" のような戻り値を期待していましたが、負の数値は返しませんでした。

またFYI 127.0.0.1:7501>評価 "リターン{1,2、のtoString(9223372036854775807)}" 0
1)(整数)1
2)(整数)2
3)「9.2233720368548 E + 18"

127.0.0.1:7501>評価 "リターン{1,2、TONUMBER(9223372036854775807)}" 0
1)(整数)1
2)(整数)2
3) (整数)-9223372036854775808

答えて

2

ドキュメントページ(https://redis.io/commands/eval)から撮影:

Luaは、単一の数値タイプ、Luaの番号を持っています。整数と浮動小数点の区別はありません。だから私たちは常にルアの数値を整数の返り値に変換し、もしあれば数値の小数部分を削除します。 Luaから浮動小数点数を返す場合は、それを文字列として返す必要があります。これは、Redis自体とまったく同じです(たとえば、ZSCOREコマンドを参照してください)。

使用している数値(〜10^19)は大きすぎてLuaで整数として表現できないため、浮動小数点数になります。 Redis型変換によって整数に変換されると、オーバーフローして負の値になります。

+0

私が知っているのは、ダブルビットで符号ビットが正のときにオーバーフローする理由は、 が赤字に戻ったときです。 – sumanth232

+0

整数と浮動小数点のエンコーディングは異なります。この型変換は、明示的に 'tostring'を使用しない限り、デフォルトで整数になります。符号付き整数の表現としてFPエンコーディングを使用すると、予期しない結果が生じます。 –

関連する問題