• trunc(), floor() and ceil() handmade

    From Bonita Montero@3:633/10 to All on Wed Jul 22 19:47:52 2026
    double xtrunc( double v ) noexcept
    {
    static_assert( sizeof( double ) == 8 && numeric_limits<double>::is_iec559 );
    constexpr uint64_t Sign = ~(~0ull >> 1);
    constexpr int NoFract = 0x3FF + 52;
    uint64_t
    bin = bit_cast<uint64_t>( v ),
    nsBin = bin & ~Sign;
    int fractBits = NoFract - (int)(nsBin >> 52);
    if( fractBits <= 0 ) [[unlikely]]
    return v;
    if( fractBits > 52 ) [[unlikely]]
    return bit_cast<double>( bin & Sign );
    bin &= ~0ull << fractBits;
    return bit_cast<double>( bin );
    }

    double xfloor( double v ) noexcept
    {
    double truncd = xtrunc( v );
    if( v - truncd == 0.0 ) [[unlikely]]
    return v;
    return truncd - (v >= 0.0 ? 0.0 : 1.0);
    }

    double xceil( double v ) noexcept
    {
    double truncd = xtrunc( v );
    if( v - truncd == 0.0 ) [[unlikely]]
    return v;
    return truncd + (v >= 0.0 ? 1.0 : 0.0);
    }

    +/-Inf and +/-NaN also work.

    --- PyGate Linux v1.5.18
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)