Tiene esta aplicación de frexp cualquier comportamiento indefinido?

votos
0

He construido una versión personalizada de frexp:

auto frexp(float f) noexcept
{
    static_assert(std::numeric_limits<float>::is_iec559);

    uint32_t u;
    std::memcpy(&u, &f, sizeof(float)); // well defined bit transformation from float to int

    int exp = ((u >> 23) & 0xff) - 126; // extract the 8 bits of the exponent (it has an offset of 126)

    // divide by 2^exp (leaving mantissa intact while placing 0 into the exponent)
    u &= ~(0xff << 23); // zero out the exponent bits
    u |= 126 << 23; // place 126 into exponent bits (representing 0)

    std::memcpy(&f, &u, sizeof(float)); // copy back to f
    return std::make_pair(exp, f);
}

Al marcar is_iec559me estoy asegurando de que floatfulfills

los requisitos de la norma IEC 559 (754 IEEE) estándar.

Mi pregunta es: ¿Esto significa que las operaciones de bits que estoy haciendo están bien definidos y hacen lo que yo quiero? Si no es así, ¿hay alguna manera de solucionarlo?

Lo probé por algunos valores aleatorios y parece ser correcta, al menos en Windows 10 compilado con msvc y en wandbox . Tenga en cuenta sin embargo, que (a propósito) yo no estoy manejando los casos extremos de 0, NaNy inf.

Si alguien se pregunta por qué estoy haciendo esto: En los puntos de referencia que encontré que esta versión de frexpes hasta 15 veces más rápido que std::frexpen Windows 10. No he probado otras plataformas todavía. Pero yo quiero estar seguro de que esto no sólo trabaja por coincidentes y frenos puedan en el futuro.

Publicado el 09/10/2019 a las 18:58
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more