From 3992a13f24fec116cd4d0920dfd51abaf76a207e Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Thu, 12 Jan 2023 15:40:34 -0500 Subject: [PATCH] Improve `MetaDataRef:{get,set}_float` precision (#13130) --- games/devtest/mods/unittests/metadata.lua | 7 +++++++ src/script/lua_api/l_metadata.cpp | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/games/devtest/mods/unittests/metadata.lua b/games/devtest/mods/unittests/metadata.lua index 2246469ed..6b0dcf04a 100644 --- a/games/devtest/mods/unittests/metadata.lua +++ b/games/devtest/mods/unittests/metadata.lua @@ -63,6 +63,13 @@ local function test_metadata(meta) assert(meta:get_float("h") > 1) assert(meta:get_string("i") == "${f}") + meta:set_float("j", 1.23456789) + assert(meta:get_float("j") == 1.23456789) + meta:set_float("j", -1 / 0) + assert(meta:get_float("j") == -1 / 0) + meta:set_float("j", 0 / 0) + assert(core.is_nan(meta:get_float("j"))) + meta:from_table() assert(next(meta:to_table().fields) == nil) assert(#meta:get_keys() == 0) diff --git a/src/script/lua_api/l_metadata.cpp b/src/script/lua_api/l_metadata.cpp index 68b79331b..52d7617d1 100644 --- a/src/script/lua_api/l_metadata.cpp +++ b/src/script/lua_api/l_metadata.cpp @@ -177,7 +177,9 @@ int MetaDataRef::l_get_float(lua_State *L) std::string str_; const std::string &str = meta->getString(name, &str_); - lua_pushnumber(L, stof(str)); + // Convert with Lua, as is done in set_float. + lua_pushlstring(L, str.data(), str.size()); + lua_pushnumber(L, lua_tonumber(L, -1)); return 1; } @@ -188,8 +190,9 @@ int MetaDataRef::l_set_float(lua_State *L) MetaDataRef *ref = checkAnyMetadata(L, 1); std::string name = luaL_checkstring(L, 2); - float a = readParam(L, 3); - std::string str = ftos(a); + luaL_checknumber(L, 3); + // Convert number to string with Lua as it gives good precision. + std::string str = readParam(L, 3); IMetadata *meta = ref->getmeta(true); if (meta != NULL && meta->setString(name, str)) -- 2.44.0