Merge pull request #110616 from aaronfranke/fix-rtos-fix-32bit

Apply rtos_fix hack for handling 32-bit floats on all calls to rtos_fix
This commit is contained in:
Thaddeus Crews 2025-09-30 11:19:16 -05:00
commit 79d0eea742
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC

View file

@ -1978,19 +1978,10 @@ Error VariantParser::parse(Stream *p_stream, Variant &r_ret, String &r_err_str,
//////////////////////////////////////////////////////////////////////////////////
// These two functions serialize floats or doubles using num_scientific to ensure
// it can be read back in the same way (except collapsing -0 to 0, and NaN values).
static String rtos_fix(float p_value, bool p_compat) {
if (p_value == 0.0f) {
return "0"; // Avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist.
} else if (p_compat) {
// Write old inf_neg for compatibility.
if (std::isinf(p_value) && p_value < 0.0f) {
return "inf_neg";
}
}
return String::num_scientific(p_value);
}
// it can be read back in the same way, except collapsing -0 to 0, collapsing
// NaN values, handling old inf_neg for compatibility, and collapsing doubles
// that match their 32-bit float representation to avoid serializing garbage
// digits when the underlying float is 32-bit.
static String rtos_fix(double p_value, bool p_compat) {
if (p_value == 0.0) {
return "0"; // Avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist.
@ -2000,6 +1991,10 @@ static String rtos_fix(double p_value, bool p_compat) {
return "inf_neg";
}
}
// Hack to avoid garbage digits when the underlying float is 32-bit.
if ((double)(float)p_value == p_value) {
return String::num_scientific((float)p_value);
}
return String::num_scientific(p_value);
}
@ -2026,13 +2021,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break;
case Variant::FLOAT: {
const double value = p_variant.operator double();
String s;
// Hack to avoid garbage digits when the underlying float is 32-bit.
if ((double)(float)value == value) {
s = rtos_fix((float)value, p_compat);
} else {
s = rtos_fix(value, p_compat);
}
String s = rtos_fix(value, p_compat);
// Append ".0" to floats to ensure they are float literals.
if (s != "inf" && s != "-inf" && s != "nan" && !s.contains_char('.') && !s.contains_char('e') && !s.contains_char('E')) {
s += ".0";