¿Problema al comparar números de punto flotante y cómo compararlos correctamente?

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>
Producción: 

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.
Producción: 

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>
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *