es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo decirle a Rust que haga todas las comparaciones de números de punto flotante utilizando una biblioteca específica de forma predeterminada?

Me gustaría que todas las comparaciones de números decimales se realicen con float_cmp::approx_eq (por ejemplo), pero seguir utilizando el operador de comparación de igualdad ==. ¿Cómo puedo lograr esto?

impl PartialEq for f32 {
    fn eq(&self, other: &Self) -> bool {
        approx_eq!(f32, *self, *other)
    }
}

Resulta en:

error[E0119]: implementaciones en conflicto para el trait `std::cmp::PartialEq` para el tipo `f32`
error[E0117]: sólo los traits definidos en la creación actual pueden ser implementados para tipos arbitrarios
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el uso de float_cmp::approx_eq para todas las comparaciones de números flotantes mientras se utiliza el operador de comparación de igualdad ==, puedes implementar el rasgo PartialEq para un nuevo tipo que envuelva a f32 en lugar de implementarlo directamente para f32. De esta forma, puedes usar == para las comparaciones, pero la implementación subyacente utilizará approx_eq. Aquí tienes un ejemplo de implementación:

    use float_cmp::approx_eq;
    
    struct ApproxFloat(f32);
    
    impl PartialEq for ApproxFloat {
        fn eq(&self, other: &Self) -> bool {
            approx_eq!(f32, self.0, other.0)
        }
    }
    
    fn main() {
        let a = ApproxFloat(0.1 + 0.2);
        let b = ApproxFloat(0.3);
        assert!(a == b); // no hay errores de compilación o tiempo de ejecución
    }
    

    En este ejemplo, ApproxFloat es un nuevo tipo con un único campo de tipo f32. Implementamos PartialEq para este nuevo tipo y utilizamos approx_eq para realizar la comparación real de los valores f32. Ahora puedes crear instancias de ApproxFloat y utilizar == para compararlas, pero la implementación subyacente utilizará approx_eq para la comparación de los valores f32.

Comments are closed.