如果Lua数字是双精度浮点型,那么= / <=/>=操作总是正确的吗?
2012-5-10 2:23:8
收藏:0
阅读:151
评论:2
你知道,浮点数存在一个精度问题,即值为1的情况下可能变成0.9999999。Lua在C语言中使用==比较两个双精度浮点数是否相等。所以问题来了:
a = 5.6
b = 14 * 0.4
print(a==b) ; => false
更糟糕的是:
a = 1
...
if a < 1 then print("<1") end ; => sometimes a < 1
那怎么避免这种情况呢?我查看了Lua源代码,似乎可以修改luaconf.h中的luai_num_eq/luai_num_le宏,但这是必要的吗?
更新
第二个例子实际上不是很准确。实际上我的问题是,我将一个值为1的参数传递给C/C++,使用lua_tonumber获取该值,然后将其存储在双精度变量中,并在一定时间后向Lua中推送该值(lua_pushnumber),导致a<1的情况发生:
在Lua中:
my_cfunction(1)
...
在C中:
int my_cfunction(lua_State *L) {
double val = lua_tonumber(L, 1);
...
...
lua_pushnumber(L, val);
在Lua中:
local a = my_cfunction2()
if a < 1 then ... end
原文链接 https://stackoverflow.com/questions/10526615
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
你知道的,浮点数存在精度问题,即值 1 将变成 0.9999999。
我完全不知道。因为这不是真的。1.0 就是 1.0。这个:
a = 1 if a < 1 then print("<1") end
永远不会打印 "<1"。除非你实际更改了
a
。即使是这个:a = 2 a = a - 1 if a < 1 then print("<1") end
同样也永远不会触发
print
语句。只要你对 Lua 的数字进行整数运算,你最终会得到整数。加法、减法或乘法都不会让你得到非整数值。