Έχει αυτήν την εφαρμογή της frexp κάθε απροσδιόριστη συμπεριφορά;

ψήφοι
0

Έχω δημιουργήσει μια προσαρμοσμένη έκδοση του 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);
}

Με τον έλεγχο is_iec559Είμαι βεβαιωθείτε ότι floatπληροί

οι απαιτήσεις του IEC 559 (IEEE 754) πρότυπο.

Η ερώτησή μου είναι: Μήπως αυτό σημαίνει ότι οι πράξεις bit που κάνω είναι σαφώς καθορισμένες και κάνω αυτό που θέλω; Αν όχι, είναι ένας τρόπος για να το διορθώσω εκεί;

Θα δοκιμαστεί για κάποιες τυχαίες τιμές και φαίνεται να είναι σωστή, τουλάχιστον για τα Windows 10 καταρτίζονται με MSVC και wandbox . Σημειώστε, ωστόσο, ότι (επίτηδες) Δεν είμαι χειρισμό των υποθέσεων άκρη 0, NaNκαι inf.

Αν κάποιος αναρωτιέται γιατί το κάνω αυτό: Σε αναφοράς βρήκα ότι αυτή η εκδοχή του frexpείναι έως και 15 φορές πιο γρήγορα από std::frexpτα Windows 10. Δεν το έχω δοκιμάσει άλλες πλατφόρμες ακόμα. Αλλά θέλω να βεβαιωθείτε ότι αυτό λειτουργεί όχι μόνο από συμπίπτουν και μπορεί φρένο στο μέλλον.

Δημοσιεύθηκε 09/10/2019 στις 18:58
πηγή χρήστη
Σε άλλες γλώσσες...                            

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