Bonita Montero
unread,Nov 4, 2019, 6:20:04 PM11/4/19You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Was würde eigentlich dagegen sprechen, dass analog numeric_limits
<floattype>::is_iec559 es für Ganzzahl-Typen Flags gibt die sagen
ob der Zahlentyp erstens das Zweier-Komplement hat? Und zweitens,
ob das, wenn das der Fall ist, das übliche Zweier-Komplement-Wrap
-Around hat?
Eine weitere Möglichkeit wäre, dass man Abfragen könnte ob Shifts
auf signed Ganzzahlwerte sich so verhalten wie auf den meisten
Plattformen, also das Vorzeichen, in welche Richtung man auch
immer shiftet, beibehalten wird.
Dann könnte man auf diese Eigenschaften nämlich ein static_assert
machen und entsprechend eine Fehlermeldung ausgeben.
Ich hab nämlich gerade mal eine schnelle floor-Funktion geschrieben
und da hätte ich gern auf das signed shift static_assert-ed.
double ffloor( double d )
{
static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double)
not equal to sizeof(DWORDLONG)");
static_assert(numeric_limits<double>::is_iec559, "double must be
IEEE-754");
uint64_t dx = reinterpret_cast<uint64_t &>(d);
uint64_t exp;
unsigned shift;
if( (exp = dx & 0x7FF0000000000000u) >= 0x3FF0000000000000u )
if( exp < (uint64_t)(0x3FFu + 0x52u) << 52 )
{
// value has a fraction, mask it
shift = (unsigned)(exp >> 52) - 0x3FFu;
dx &= (uint64_t)((int64_t)0xFFF0000000000000 >> shift);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return reinterpret_cast<double &>(dx);
}
else
if( exp < 0x7FF0000000000000u )
// value is integral
return d;
else
// infinite, NaN, SNaN
// raise exception on SNaN if necessary
return d + d;
else
return 0.0;
}