Răsfoiți Sursa

Merge pull request #31871 from aaronfranke/equal-approx-inf

Check for exact equality before approximate equality
Rémi Verschelde 6 ani în urmă
părinte
comite
40a9cc66a9

+ 10 - 0
core/math/math_funcs.h

@@ -300,6 +300,11 @@ public:
 	}
 
 	static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b) {
+		// Check for exact equality first, required to handle "infinity" values.
+		if (a == b) {
+			return true;
+		}
+		// Then check for approximate equality.
 		real_t tolerance = CMP_EPSILON * abs(a);
 		if (tolerance < CMP_EPSILON) {
 			tolerance = CMP_EPSILON;
@@ -308,6 +313,11 @@ public:
 	}
 
 	static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b, real_t tolerance) {
+		// Check for exact equality first, required to handle "infinity" values.
+		if (a == b) {
+			return true;
+		}
+		// Then check for approximate equality.
 		return abs(a - b) < tolerance;
 	}
 

+ 5 - 0
modules/mono/glue/Managed/Files/Mathf.cs

@@ -158,6 +158,11 @@ namespace Godot
 
         public static bool IsEqualApprox(real_t a, real_t b)
         {
+            // Check for exact equality first, required to handle "infinity" values.
+            if (a == b) {
+                return true;
+            }
+            // Then check for approximate equality.
             real_t tolerance = Epsilon * Abs(a);
             if (tolerance < Epsilon) {
                 tolerance = Epsilon;

+ 6 - 1
modules/mono/glue/Managed/Files/MathfEx.cs

@@ -48,7 +48,12 @@ namespace Godot
 
         public static bool IsEqualApprox(real_t a, real_t b, real_t tolerance)
         {
+            // Check for exact equality first, required to handle "infinity" values.
+            if (a == b) {
+                return true;
+            }
+            // Then check for approximate equality.
             return Abs(a - b) < tolerance;
         }
     }
-}
+}