En este artículo, veremos cuál es el problema al comparar números de punto flotante y discutiremos la forma correcta de comparar dos números de punto flotante.
¿Cuál es el problema al comparar números de punto flotante por lo general?
Primero comparemos dos números de punto flotante con la ayuda del operador relacional (==) .
Ejemplo: Usar “==” para comparar
CPP
// C++ program to compare // floating point numbers #include <bits/stdc++.h> using namespace std; void compareFloatNum(double a, double b) { if (a == b) { cout << "The numbers are equal" << endl; } else { cout << "The numbers are not equal" << endl; } } // Driver code int main() { double a = (0.3 * 3) + 0.1; double b = 1; compareFloatNum(a, b); }
Java
// Java program to compare // floating point numbers class GFG { static void compareFloatNum(double a, double b) { if (a == b) { System.out.print("The numbers are equal" + "\n"); } else { System.out.print("The numbers are not equal" + "\n"); } } // Driver code public static void main(String[] args) { double a = (0.3 * 3) + 0.1; double b = 1; compareFloatNum(a, b); } } // This code is contributed by 29AjayKumar
Python
# Python program to compare # floating point numbers def compareFloatNum(a, b): if (a == b): print("The numbers are equal") else: print("The numbers are not equal") # Driver code a = (0.3 * 3) + 0.1 b = 1 compareFloatNum(a, b) # This code is contributed by mohit kumar 29
C#
// C# program to compare // floating point numbers using System; class GFG { static void comparefloatNum(double a, double b) { if (a == b) { Console.Write("The numbers are equal" + "\n"); } else { Console.Write("The numbers are not equal" + "\n"); } } // Driver code public static void Main(String[] args) { double a = (0.3 * 3) + 0.1; double b = 1; comparefloatNum(a, b); } } // This code is contributed by PrinciRaj1992
Javascript
<script> function compareFloatNum(a,b) { if (a == b) { document.write("The numbers are equal" + "<br>"); } else { document.write("The numbers are not equal" + "<br>"); } } let a = (0.3 * 3) + 0.1; let b = 1; compareFloatNum(a, b); // This code is contributed by patel2127 </script>
The numbers are not equal
¿Por qué ocurre este problema?
En el caso de los números de punto flotante, el operador relacional (==) no produce una salida correcta, esto se debe a los errores internos de precisión al redondear los números de punto flotante.
En el ejemplo anterior, podemos ver la inexactitud al comparar dos números de coma flotante usando el operador “==”. Los dos números ‘a’ y ‘b’ son iguales (como (0.3 * 3) + 0.1 = 1) pero el programa da como resultado una salida incorrecta.
Echemos un vistazo más de cerca a los números en el siguiente fragmento.
CPP
// C++ program to compare // floating point numbers #include <bits/stdc++.h> using namespace std; void printFloatNum(double a, double b) { // To print decimal numbers up to 20 digits cout << setprecision(20); cout << "a is : " << a << endl; cout << "b is : " << b << endl; } // Driver code int main() { double a = (0.3 * 3) + 0.1; double b = 1; printFloatNum(a, b); }
Python3
# Python 3 program to compare # floating point numbers def printFloatNum(a, b): # To print decimal numbers up to 20 digits print("a is : %.20f" %a) print("b is : %.20f" %b) # Driver code if __name__ == "__main__": a = (0.3 * 3) + 0.1 b = 1 printFloatNum(a, b) # This code is contributed by ukasp.
a is : 0.99999999999999988898 b is : 1
Ahora podemos ver el error de redondeo interno en números de coma flotante. El número ‘a’ no está correctamente redondeado a 1,
hay un error interno en el redondeo, un error muy pequeño pero hace una gran diferencia cuando comparamos los números.
¿Cómo comparar números de punto flotante correctamente?
Si tenemos que comparar dos números de coma flotante, en lugar de usar el operador «==», encontraremos la diferencia absoluta entre los números (que si se representara correctamente, la diferencia habría sido 0) y la compararemos con un muy pequeño número 1e-9 (es decir, 10^-9, este número es muy pequeño) y si la diferencia es menor que este número, podemos decir con seguridad que los dos números de coma flotante son iguales.
Ejemplo:
C++
// C++ program to compare // floating point numbers correctly #include <bits/stdc++.h> using namespace std; void compareFloatNum(double a, double b) { // Correct method to compare // floating-point numbers if (abs(a - b) < 1e-9) { cout << "The numbers are equal " << endl; } else { cout << "The numbers are not equal " << endl; } } // Driver code int main() { double a = (0.3 * 3) + 0.1; double b = 1; compareFloatNum(a, b); }
Java
// Java program to compare // floating point numbers correctly class GFG { static void compareFloatNum(double a, double b) { // Correct method to compare // floating-point numbers if (Math.abs(a - b) < 1e-9) { System.out.print("The numbers are equal " +"\n"); } else { System.out.print("The numbers are not equal " +"\n"); } } // Driver code public static void main(String[] args) { double a = (0.3 * 3) + 0.1; double b = 1; compareFloatNum(a, b); } } // This code is contributed by Rajput-Ji
Python3
# Python program to compare # floating point numbers correctly def compareFloatNum(a, b): # Correct method to compare # floating-point numbers if (abs(a - b) < 1e-9): print("The numbers are equal "); else: print("The numbers are not equal "); # Driver code if __name__ == '__main__': a = (0.3 * 3) + 0.1; b = 1; compareFloatNum(a, b); # This code is contributed by PrinciRaj1992
C#
// C# program to compare // floating point numbers correctly using System; class GFG { static void comparefloatNum(double a, double b) { // Correct method to compare // floating-point numbers if (Math.Abs(a - b) < 1e-9) { Console.Write("The numbers are equal " +"\n"); } else { Console.Write("The numbers are not equal " +"\n"); } } // Driver code public static void Main(String[] args) { double a = (0.3 * 3) + 0.1; double b = 1; comparefloatNum(a, b); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript program to compare // floating point numbers correctly function compareFloatNum(a,b) { // Correct method to compare // floating-point numbers if (Math.abs(a - b) < 1e-9) { document.write("The numbers are equal " +"<br>"); } else { document.write("The numbers are not equal " +"<br>"); } } // Driver code let a = (0.3 * 3) + 0.1; let b = 1; compareFloatNum(a, b); // This code is contributed by unknown2108 </script>
The numbers are equal
Este código da como resultado la salida correcta, por lo que siempre que se comparen dos números de coma flotante, en lugar de usar el operador «==», usaremos la técnica anterior.
Publicación traducida automáticamente
Artículo escrito por DeveshRattan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA