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.

Utilice saturating_add si está disponible en Rust, retroceda a la adición regular para flotantes.

Estoy tratando de escribir una función que esté definida para ambos números flotantes e enteros.

Para los enteros, quiero usar saturating_add.
Para los números flotantes, no existe una función saturatingadd, pero la suma normal es saturating (en el sentido de que valor infinito + valor positivo = valor infinito).

Lo que quisiera escribir es
lang-rust
fn sat_add<T: num_traits::Num>(x: T, o: T) -> T {
if implements(x, num_traits::ops::saturating::SaturatingAdd)
x.saturating_add(o) // Suma saturada, si está disponible
else
x + o // Alternativa: suma normal
}

Tenga en cuenta que T es estático, y quiero que esto se incluya en el código compilado. Así que es más una coincidencia de patrones (presente o no la característica) en lugar de programación orientada a objetos.

(Tenga en cuenta que actualmente estoy usando macros para implementar uno u otro para varios tipos estándar, pero eso solo cubre casos básicos, algo genérico sería más agradable que enumerar tipos de datos conocidos).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr una función que pueda ser definida tanto para números de punto flotante como enteros, y que utilice una suma saturada en caso de estar disponible para los enteros y suma regular para los flotantes, se puede escribir el siguiente código:

    use num_traits::{Float, Num, ops::saturating::SaturatingAdd};
    
    fn sat_add<t>(x: T, o: T) -> T
    where
        T: Num + Float,
        T: SaturatingAdd + Copy,
    {
        x.saturating_add(o)
    }
    
    fn sat_add<t>(x: T, o: T) -> T
    where
        T: Num + Float,
    {
        x + o
    }
    

    Explicación:

    • El trait Num se utiliza para definir una función que satisfaga tanto tipos enteros como de punto flotante.
    • El trait Float se utiliza para permitir el uso de números de punto flotante.
    • Al utilizar el trait ops::saturating::SaturatingAdd, se puede llamar la función saturating_add en tipos enteros.
    • El trait Copy se utiliza para que los valores se copien en lugar de moverse al llamar la función, lo que permite un código más eficiente.

    La primera función será elegida si T satisface tanto los traits SaturatingAdd como Copy, y utilizará saturating_add para enteros. La segunda función se elegirá por defecto y utilizará sumas regulares para cualquier otro tipo.

    Este enfoque permite que una única función maneje tanto enteros como números de punto flotante, utilizando la opción más eficiente disponible para cada tipo.

Comments are closed.