RFR: JDK-8289551: Conversions between bit representations of half precision values and floats [v6]

Raffaello Giulietti duke at openjdk.org
Mon Jul 25 13:39:01 UTC 2022


On Sun, 24 Jul 2022 15:45:17 GMT, Raffaello Giulietti <duke at openjdk.org> wrote:

>> I didn't test this variant, will do tomorrow when also reviewing the tests themselves.
>
> The correct variant below passes the tests.
> 
> 
>         // For binary16 subnormals, beside forcing exp to -15,
>         // retain the difference expdelta = E_min - exp.
>         // This is the excess shift value, in addition to 13, to be used
>         // in the computations below.
>         // Further the (hidden) msb with value 1 in f must be involved as well.
>         int expdelta = 0;
>         int msb = 0x0000_0000;
>         if (exp < -14) {
>             expdelta = -14 - exp;
>             exp = -15;
>             msb = 0x0080_0000;
>         }
>         int f_signif_bits = doppel & 0x007f_ffff | msb;
> 
>         // Significand bits as if using rounding to zero (truncation).
>         short signif_bits = (short)(f_signif_bits >> (13 + expdelta));
> 
>         // For round to nearest even, determining whether or
>         // not to round up (in magnitude) is a function of the
>         // least significant bit (LSB), the next bit position
>         // (the round position), and the sticky bit (whether
>         // there are any nonzero bits in the exact result to
>         // the right of the round digit). An increment occurs
>         // in three cases:
>         //
>         // LSB  Round Sticky
>         // 0    1     1
>         // 1    1     0
>         // 1    1     1
>         // See "Computer Arithmetic Algorithms," Koren, Table 4.9
> 
>         int lsb    = f_signif_bits & (1 << 13 + expdelta);
>         int round  = f_signif_bits & (1 << 12 + expdelta);
>         int sticky = f_signif_bits & ((1 << 12 + expdelta) - 1);
> 
>         if (round != 0 && ((lsb | sticky) != 0 )) {
>             signif_bits++;
>         }
> 
>         // No bits set in significand beyond the *first* exponent
>         // bit, not just the sigificand; quantity is added to the
>         // exponent to implement a carry out from rounding the
>         // significand.
>         assert (0xf800 & signif_bits) == 0x0;
> 
>         return (short)(sign_bit | ( ((exp + 15) << 10) + signif_bits ) );

Test classes look good.

-------------

PR: https://git.openjdk.org/jdk/pull/9422


More information about the core-libs-dev mailing list