Lua是否使用64位整數?我如何使用它?Lua是否使用64位整數?
回答
自己編譯。 Lua默認使用雙精度浮點數。但是,這可以在源中更改(luaconf.h
,查找LUA_NUMBER
)。
require "bit"
-- Lua unsigned 64bit emulated bitwises
-- Slow. But it works.
function i64(v)
local o = {}; o.l = v; o.h = 0; return o;
end -- constructor +assign 32-bit value
function i64_ax(h,l)
local o = {}; o.l = l; o.h = h; return o;
end -- +assign 64-bit v.as 2 regs
function i64u(x)
return (((bit.rshift(x,1) * 2) + bit.band(x,1)) % (0xFFFFFFFF+1));
end -- keeps [1+0..0xFFFFFFFFF]
function i64_clone(x)
local o = {}; o.l = x.l; o.h = x.h; return o;
end -- +assign regs
-- Type conversions
function i64_toInt(a)
return (a.l + (a.h * (0xFFFFFFFF+1)));
end -- value=2^53 or even less, so better use a.l value
function i64_toString(a)
local s1=string.format("%x",a.l);
local s2=string.format("%x",a.h);
local s3="0000000000000000";
s3=string.sub(s3,1,16-string.len(s1))..s1;
s3=string.sub(s3,1,8-string.len(s2))..s2..string.sub(s3,9);
return "0x"..string.upper(s3);
end
-- Bitwise operators (the main functionality)
function i64_and(a,b)
local o = {}; o.l = i64u(bit.band(a.l, b.l)); o.h = i64u(bit.band(a.h, b.h)); return o;
end
function i64_or(a,b)
local o = {}; o.l = i64u(bit.bor(a.l, b.l)); o.h = i64u(bit.bor(a.h, b.h)); return o;
end
function i64_xor(a,b)
local o = {}; o.l = i64u(bit.bxor(a.l, b.l)); o.h = i64u(bit.bxor(a.h, b.h)); return o;
end
function i64_not(a)
local o = {}; o.l = i64u(bit.bnot(a.l)); o.h = i64u(bit.bnot(a.h)); return o;
end
function i64_neg(a)
return i64_add(i64_not(a), i64(1));
end -- negative is inverted and incremented by +1
-- Simple Math-functions
-- just to add, not rounded for overflows
function i64_add(a,b)
local o = {};
o.l = a.l + b.l;
local r = o.l - 0xFFFFFFFF;
o.h = a.h + b.h;
if(r>0) then
o.h = o.h + 1;
o.l = r-1;
end
return o;
end
-- verify a>=b before usage
function i64_sub(a,b)
local o = {}
o.l = a.l - b.l;
o.h = a.h - b.h;
if(o.l<0) then
o.h = o.h - 1;
o.l = o.l + 0xFFFFFFFF+1;
end
return o;
end
-- x n-times
function i64_by(a,n)
local o = {};
o.l = a.l;
o.h = a.h;
for i=2, n, 1 do
o = i64_add(o,a);
end
return o;
end
-- no divisions
-- Bit-shifting
function i64_lshift(a,n)
local o = {};
if(n==0) then
o.l=a.l; o.h=a.h;
else
if(n<32) then
o.l= i64u(bit.lshift(a.l, n)); o.h=i64u(bit.lshift(a.h, n))+ bit.rshift(a.l, (32-n));
else
o.l=0; o.h=i64u(bit.lshift(a.l, (n-32)));
end
end
return o;
end
function i64_rshift(a,n)
local o = {};
if(n==0) then
o.l=a.l; o.h=a.h;
else
if(n<32) then
o.l= bit.rshift(a.l, n)+i64u(bit.lshift(a.h, (32-n))); o.h=bit.rshift(a.h, n);
else
o.l=bit.rshift(a.h, (n-32)); o.h=0;
end
end
return o;
end
-- Comparisons
function i64_eq(a,b)
return ((a.h == b.h) and (a.l == b.l));
end
function i64_ne(a,b)
return ((a.h ~= b.h) or (a.l ~= b.l));
end
function i64_gt(a,b)
return ((a.h > b.h) or ((a.h == b.h) and (a.l > b.l)));
end
function i64_ge(a,b)
return ((a.h > b.h) or ((a.h == b.h) and (a.l >= b.l)));
end
function i64_lt(a,b)
return ((a.h < b.h) or ((a.h == b.h) and (a.l < b.l)));
end
function i64_le(a,b)
return ((a.h < b.h) or ((a.h == b.h) and (a.l <= b.l)));
end
-- samples
a = i64(1); -- 1
b = i64_ax(0x1,0); -- 4294967296 = 2^32
a = i64_lshift(a,32); -- now i64_eq(a,b)==true
print(i64_toInt(b)+1); -- 4294967297
X = i64_ax(0x00FFF0FF, 0xFFF0FFFF);
Y = i64_ax(0x00000FF0, 0xFF0000FF);
-- swap algorithm
X = i64_xor(X,Y);
Y = i64_xor(X,Y);
X = i64_xor(X,Y);
print("X="..i64_toString(X)); -- 0x00000FF0FF0000FF
print("Y="..i64_toString(Y)); -- 0x00FFF0FFFFF0FFFF
爲什麼不定義一個具有metatable字段的類來支持算術運算符?爲什麼沒有函數將這些數字轉換爲十進制字符串(您也可以將此函數綁定到'__string'metatable)? 注意:如果Lua編譯爲支持帶有IEEE 64位雙精度的數字,它將精確地存儲絕對值<=(2^53)的所有數字。 – 2015-04-19 03:16:50
Lua 5.3引入了整數子類型,默認使用64位整數。
類型數使用兩個內部表示,一個叫整數,而另一個稱爲浮動。 Lua明確規定了每個表示的使用時間,但它也根據需要自動進行轉換(請參閱第3.4.3節)。因此,程序員可能會選擇忽略整數和浮點數之間的差異,或者完全控制每個數字的表示。標準Lua使用64位整數和雙精度(64位)浮點數,但您也可以編譯Lua,以便使用32位整數和/或單精度浮點數(32位)。對於小型機器和嵌入式系統,整數和浮點數均爲32位的選項特別具有吸引力。 (請參閱文件
luaconf.h
中的宏LUA_32BITS
。)
是的,這比使用32位整數或字符串數組來存儲精確值的仿真快得多。然而,Lua也可以很容易地移植到除C或C++之外的其他主機語言(例如,PHP,Java或Javascript)中運行,提供其他本地數字數據類型或更高精度的數字(例如x86體系結構中的80位長雙精度) 。 通過仿真,您還可以在Lua中支持複數或矩陣。 – 2015-04-19 03:10:27
- 1. 是否可以在64位PHP中使用較小的整數
- 2. 如何檢查一個數是否是一個64位整數
- 3. 64位整數在64位與86 OS
- 4. C++:將64位整數與32位整數比較是否安全?
- 5. 使用64位整數與Node.js響應
- 6. C++中是否有64位整數的「標準」htonl函數?
- 7. lua 64位轉換問題
- 8. Pythonic方法來檢查整數是否適合64位
- 9. Cray mpich是否有64位整數MPI變量?
- 10. Microsoft Jet 4.0是否支持64位整數?
- 11. Neo4j中的64位整數
- 12. perl下64位整數
- 13. Hashtable的64位整數
- 14. 算法使用32位無符號整數乘64位數
- 15. 64位是否需要FreeResource?
- 16. 是否有libPNG 64位?
- 17. 是否存在64位CruiseControl.NET?
- 18. 是否有64位TclPro?
- 19. 是否存在64位ActiveX?
- 20. 是否值得將64位整數轉換爲火花數據幀中的32位(16位)整數?
- 21. AVX將64位整數轉換爲64位浮點數
- 22. 無符號16位和64位整數
- 23. 使用64位整數迭代器的32位地址空間?
- 24. 使用PDO從64位轉換爲32位的整數
- 25. 如何在64位PHP安裝中使用32位整數?
- 26. 64位無符號整數是否會在32位系統上回繞?
- 27. bluecove是否適用於Linux 64位?
- 28. pyodbc庫是否適用於64位Windows?
- 29. Sikuli IDE是否適用於Windows 64位?
- 30. 是否可以使用64位Python解釋器的32位ctypes?
爲了說明起見,Lua具有單個數字數據類型。默認情況下,這是一個'double',但可以在頭文件中更改爲另一種類型,例如'int64_t'。 – 2010-06-23 19:18:44
如果更改了'luaconf.h'中的數字類型,請不要忘記相應地更改相關的宏。 – lhf 2010-06-23 21:44:40
@lhf:儘管它被記錄在宏的上方,但我認爲它會很容易被發現。 – Joey 2010-06-23 22:17:47