Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zweier-Komplement

12 views
Skip to first unread message

Bonita Montero

unread,
Nov 4, 2019, 6:20:04 PM11/4/19
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;
}

Bonita Montero

unread,
Nov 5, 2019, 5:50:05 AM11/5/19
to
Hab grad gelesen, dass das C++20-proposal p0907r0 in ungefähr das
vorschlägt.
0 new messages