Lua十进制符号?
2009-8-23 10:34:3
收藏:0
阅读:360
评论:8
我在其他语言中使用过这个函数,但是 Lua 似乎缺少这个非常有用的函数。
你们中的哪位好人能为我提供一个 Lua 函数,以获取传递给它的数字的符号?
原文链接 https://stackoverflow.com/questions/1318220
点赞
stackoverflow用户107090
函数 `math.sign(x)` 返回参数 `x` 的符号。如果 `x` 小于 0,则返回 -1;如果 `x` 大于 0,则返回 1;如果 `x` 等于 0,则返回 0。
```lua
function math.sign(x)
if x<0 then
return -1
elseif x>0 then
return 1
else
return 0
end
end
2009-08-23 11:30:33
stackoverflow用户312586
为了以防万一有人看到这个,这是更为简短的版本:
function sign(x)
return x>0 and 1 or x<0 and -1 or 0
end
2010-04-12 23:42:50
stackoverflow用户357410
我认为这个想法是返回1或-1来表示正数或负数。我认为你不希望它返回0。可能会有灾难性的影响。想象一下,当它返回0时,尝试通过将其乘以sign(x)来改变值的符号。与其改变符号,你会将值改为0。
我会坚持使用
function sign(x)
return (x<0 and -1) or 1
end
2010-06-03 11:34:56
stackoverflow用户1511802
你也可以像这样获取一个数的符号:
x / math.abs(x)
我只会在整数上使用它,而 Lua 并不区分整数和浮点数,所以我不会在 Lua 中使用它。
2012-07-09 11:18:35
stackoverflow用户2428487
使用 LuaJIT,如果 sign 函数被 JIT 编译,这实际上更快:
function sign(x)
return math.max(math.min(x * 1e200 * 1e200, 1), -1)
end
原因是它避免了分支,这可能是昂贵的。双倍乘法确保即使在非规范范围内输入时,结果也是正确的。不能使用无穷大,因为对于零输入,它会产生 NaN。
只在 x86 中进行了测试。无法保证它在 LuaJIT 支持的其他处理器中最快。
2020-11-17 16:09:32
stackoverflow用户5688146
我写了这个函数是因为我需要精确地处理 -0
、+0
和 nan
,其他版本都无法处理。
这个函数的思路是直接解释符号位,并且使用无分支的方式进行测试。在纯 Lua 中,你需要使用 tostring(x)
来检查正负零。
local _sign_helper = ffi.new("union { double d; uint64_t ul; int64_t l; }[1]")
local function sign(num)
-- 为了访问 double 类型的位表示
_sign_helper[0].d = num
-- 将它重新解释为 ulong,来访问符号位
-- 1. 将位移到第一位
-- 2. 乘以 -2 来将范围从 0/1 移到 0/-2
-- 4. 加上 1 来将范围减小到 -1/1
-- 处理 NaN 的另一种版本(可能更快,未经测试)
-- return num ~= num and num or (tonumber(bit.rshift(_sign_helper[0].ul, 63)) * -2 + 1)
-- 无分支版本:num - num 除了 NaN 外总是为 0。
return (tonumber(bit.rshift(_sign_helper[0].ul, 63)) * -2 + 1) * ((num - num + 1) / 1)
end
print("(number < 0)", sign(-3)) -- > -1
print("(number > 0)", sign(3)) -- > 1
print("(nan)", sign(0 / 0)) -- > nan
print("(-inf)", sign(-0 / 1)) -- > -1
print("(+inf)", sign(0 / 1)) -- > 1
print("(+0)", sign(0)) -- > 1
print("(-0)", sign(-0)) -- > -1
2021-04-22 11:20:24
stackoverflow用户2755116
一种变体如下参考链接:
function sign(x)
if x<0 then
return "-"
elseif x>0 then
return "+"
else
return ""
end
end
根据数学上的定义,符号数学上是'+'或'-'(符号),而不是数值(如+1或-1)。
2021-07-23 18:17:50
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以像这样检查
sign
:i = -2 if i == math.abs(i) then -- 或者 i >= 0 print "positive" else print "negative" end