I have found a bug where you are losing precision on float.
Description
Details
- Severity
- Major
- Resolution
- Open
- Reproducibility
- Always
- Operating System
- Windows 10 x64
- Category
- General
modded class MissionGameplay extends MissionBase { float gettest() { return 0.01; } float getprice() { float price = 0; int amount = 10; while ( amount > 0 ) { price += gettest(); amount--; } return price; } override void OnKeyPress(int key) { super.OnKeyPress(key); if ( key == KeyCode.KC_B ) { float price = getprice(); string txt = " price : " + price + " test 1 : " + (price - 0.1); GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(CCDirect, "", txt, "")); } } }
That's a screen to see what it's doing:
The step to reproduce give you a code to put inside a mod or a modded class, it's will print you the price in chat when you press B, you see it's telling you 0.1, but in reality if you do price - 0.1 like I do, you see it's a little number like 3.27888e-08, but normally it's would be 0.
That's a really annoying bug for us in Expansion. I took a day to find where it's come from and to put a step to reproduce that's working in vanilla too.
Event Timeline
I can verify this happening in several locations, floats losing their accuracy.
void ExportScene() { SaveScene(); string toCopy; string modelName; vector modelPosition; vector modelOrientation; vector modelSize; TStringArray strs = new TStringArray; string modelNameCleaned; float modelRelPosY, modelAdjustedX; ref array<ref ModelDataClass> m_ModelData = new array<ref ModelDataClass>; foreach (Object m_object : m_Objects) { modelName = m_object.ConfigGetString("model"); modelName.Split("\\", strs); modelNameCleaned = strs[(strs.Count() - 1)]; modelNameCleaned.Replace(".p3d", ""); modelPosition = m_object.GetPosition(); modelOrientation = m_object.GetOrientation(); modelSize = GetObjectSize(m_object); GetGame().ObjectDelete(m_object); m_ModelData.Insert(new ModelDataClass(modelNameCleaned, modelPosition, modelOrientation, modelSize)); } foreach (ModelDataClass m_model : m_ModelData) { modelRelPosY = m_model.m_Position[1] - GetGame().SurfaceY(m_model.m_Position[0], m_model.m_Position[2]) - (m_model.m_Size[1] / 2); modelAdjustedX = m_model.m_Position[0] + 200000.00001; toCopy = toCopy + "\"" + m_model.m_Name + "\";" + modelAdjustedX + ";" + m_model.m_Position[2] + ";" + m_model.m_Orientation[0] + ";" + m_model.m_Orientation[1] + ";" + m_model.m_Orientation[2] + "; 1.0;" + modelRelPosY + ";\n"; } GetGame().CopyToClipboard( toCopy ); Message( "Copied to clipboard" ); m_Objects.Clear(); LoadScene(); }
this is a modified export function for Community-Online-Tools, the 200000.00001 was part of my tests to figure out why the floating point precision was being lost (thinking that it would solve it, but it doesn't)