f256 0.11.2

Octuple-precision floating-point arithmetic.
Documentation
// ---------------------------------------------------------------------------
// Copyright:   (c) 2022 ff. Michael Amrhein (michael@adrhinum.de)
// License:     This program is part of a larger application. For license
//              details please read the file LICENSE.TXT provided together
//              with the application.
// ---------------------------------------------------------------------------
// $Source$
// $Revision$

use super::{fast_approx::fast_approx, slow_exact::f256_exact};
use crate::{
    f256, BigUInt, FIVE, HI_FRACTION_BIAS, HI_FRACTION_BITS,
    HI_FRACTION_MASK, HI_SIGN_SHIFT, U256,
};

const MAX_SIGNIF_HI: u128 = HI_FRACTION_BIAS + HI_FRACTION_MASK;
const MAX_EXP10: u32 = 102;

/// Create a correctly rounded `f256` from a canonical decimal representation.
pub(super) fn fast_exact(
    lit: &str,
    sign: u32,
    exp10: i32,
    mut signif10: U256,
    signif_truncated: bool,
) -> f256 {
    // We have a number with a canonical decimal representation (-1)ˢ × w ×
    // 10ᵏ, where s ∈ {0, 1}, 0 < w < 2²⁵⁶ and |k| <= 78913.
    // We need to transform it into (-1)ˢ × (1 + m × 2¹⁻ᵖ) × 2ᵉ,
    // where p = 237, Eₘᵢₙ <= e <= Eₘₐₓ and 0 < m < 2ᵖ⁻¹.
    debug_assert!(sign == 0 || sign == 1);
    debug_assert!(!signif10.is_zero());

    // Under the conditions w < 2²³⁷ and |k| <= 102 we apply the following:
    // w < 2ᵖ => w is exactly representable as a f256 value x.
    // w × 10ᵏ = w × 5ᵏ × 2ᵏ.
    // |k| <= 102 => 5ᵏ < 2²³⁷ => 5ᵏ is exactly representable as a f256 value
    // y. Calculating w × 5ᵏ as x × y (if k >= 0) or as x / y (if k < 0)
    // gives a correctly rounded result (1 + m × 2¹⁻ᵖ) × 2ᵗ.
    // Finally, setting e = t + k and setting the sign gives the required
    // result.
    let exp10_abs = exp10.unsigned_abs();
    if signif10.hi.0 <= MAX_SIGNIF_HI && exp10_abs <= MAX_EXP10 {
        let x = f256::from_u256(&signif10);
        let y = POWERS_OF_FIVE[exp10_abs as usize];
        let mut f: f256;
        if exp10 < 0 {
            f = x / y;
            // e = t + k
            f.bits.hi.0 -= ((exp10_abs as u128) << HI_FRACTION_BITS);
        } else {
            f = x * y;
            // e = t + k
            f.bits.hi.0 += ((exp10_abs as u128) << HI_FRACTION_BITS);
        };
        f.bits.hi.0 |= (sign as u128) << HI_SIGN_SHIFT;
        if signif_truncated {
            // The real significand w' has been truncated, so f may be less
            // than the correctly rounded result f'. But
            // w < w' < w+1 => f <= f' <= f"
            // where f" is the transformation of (-1)ˢ × (w+1) × 10ᵏ.
            // If f = f" then f = f'.
            let mut signif10_incr = signif10;
            signif10_incr.incr();
            if f == fast_exact(lit, sign, exp10, signif10_incr, false) {
                return f;
            }
            // The approx algorithm will not give a different result here, so
            // we fall back directly.
            return f256_exact(lit);
        } else {
            return f;
        }
    }
    fast_approx(lit, sign, exp10, signif10, signif_truncated)
}

#[rustfmt::skip]
const POWERS_OF_FIVE: [f256; (MAX_EXP10 + 1) as usize] = [
    f256::from_be_bytes([63, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 131, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 168, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 206, 132, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 0, 243, 18, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 23, 215, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 61, 205, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 98, 160, 95, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 135, 72, 118, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 173, 26, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 210, 48, 156, 229, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 1, 246, 188, 196, 30, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 28, 107, 245, 38, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 65, 195, 121, 55, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 102, 52, 87, 133, 216, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 139, 193, 109, 103, 78, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 177, 88, 228, 96, 145, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 213, 175, 29, 120, 181, 140, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 2, 251, 26, 228, 214, 226, 239, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 32, 240, 207, 6, 77, 213, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 69, 45, 2, 199, 225, 74, 246, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 106, 120, 67, 121, 217, 157, 180, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 144, 139, 42, 44, 40, 2, 144, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 180, 173, 244, 183, 50, 3, 52, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 3, 217, 217, 113, 228, 254, 132, 1, 231, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 0, 39, 231, 47, 31, 18, 129, 48, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 36, 49, 224, 250, 230, 215, 33, 124, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 73, 62, 89, 57, 160, 140, 233, 219, 212, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 111, 141, 239, 136, 8, 176, 36, 82, 201, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 147, 184, 181, 181, 5, 110, 22, 179, 190, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 184, 166, 227, 34, 70, 201, 156, 96, 173, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 4, 222, 208, 155, 234, 216, 124, 3, 120, 216, 230, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 3, 66, 97, 114, 199, 77, 130, 43, 135, 143, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 40, 18, 249, 207, 121, 32, 226, 182, 105, 115, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 78, 23, 184, 67, 87, 105, 27, 100, 3, 208, 218, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 114, 206, 211, 42, 22, 161, 177, 30, 130, 98, 136, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 151, 130, 135, 244, 156, 74, 29, 102, 34, 251, 42, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 189, 99, 41, 241, 195, 92, 164, 191, 171, 185, 245, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 5, 226, 93, 250, 55, 26, 25, 230, 247, 203, 84, 57, 92, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 6, 245, 120, 196, 224, 160, 96, 181, 190, 41, 71, 179, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 44, 178, 214, 246, 24, 200, 120, 227, 45, 179, 153, 160, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 81, 239, 198, 89, 207, 125, 75, 141, 252, 144, 64, 4, 116, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 118, 107, 183, 240, 67, 92, 158, 113, 123, 180, 80, 5, 145, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 156, 6, 165, 236, 84, 51, 198, 13, 218, 161, 100, 6, 245, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 193, 132, 39, 179, 180, 160, 91, 200, 168, 164, 222, 132, 89, 134, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 6, 229, 229, 49, 160, 161, 200, 114, 186, 210, 206, 22, 37, 111, 232, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 11, 94, 126, 8, 202, 58, 143, 105, 135, 129, 155, 174, 203, 226, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 49, 27, 14, 197, 126, 100, 153, 161, 244, 177, 1, 77, 63, 109, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 85, 97, 210, 118, 221, 253, 192, 10, 113, 221, 65, 160, 143, 72, 175, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 122, 186, 71, 20, 149, 125, 48, 13, 14, 84, 146, 8, 179, 26, 219, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 160, 180, 108, 108, 221, 110, 62, 8, 40, 244, 219, 69, 111, 240, 200, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 196, 225, 135, 136, 20, 201, 205, 138, 51, 50, 18, 22, 203, 236, 251, 36, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 7, 234, 25, 233, 106, 25, 252, 64, 236, 191, 254, 150, 156, 126, 232, 57, 237, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 16, 80, 49, 226, 80, 61, 168, 147, 247, 255, 30, 33, 207, 81, 36, 52, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 52, 100, 62, 90, 228, 77, 18, 184, 245, 254, 229, 170, 67, 37, 109, 65, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 89, 125, 77, 241, 157, 96, 87, 103, 51, 126, 159, 20, 211, 238, 200, 146, 14, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 127, 220, 161, 110, 4, 184, 109, 65, 0, 94, 70, 218, 8, 234, 122, 182, 145, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 163, 233, 228, 228, 194, 243, 68, 72, 160, 58, 236, 72, 69, 146, 140, 178, 27, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 200, 228, 94, 29, 243, 176, 21, 90, 200, 73, 167, 90, 86, 247, 47, 222, 161, 234, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 8, 239, 29, 117, 165, 112, 156, 26, 177, 122, 92, 17, 48, 236, 180, 251, 214, 74, 101, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 19, 114, 105, 135, 102, 97, 144, 174, 236, 121, 138, 190, 147, 241, 29, 101, 238, 127, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 56, 79, 3, 233, 63, 249, 244, 218, 167, 151, 237, 110, 56, 237, 100, 191, 106, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 94, 98, 196, 227, 143, 248, 114, 17, 81, 125, 232, 201, 199, 40, 189, 239, 68, 166, 193, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 130, 253, 187, 14, 57, 251, 71, 74, 210, 238, 177, 126, 28, 121, 118, 181, 138, 232, 56, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 167, 189, 41, 209, 200, 122, 25, 29, 135, 170, 93, 221, 163, 151, 212, 98, 237, 162, 70, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 205, 172, 116, 70, 58, 152, 159, 100, 233, 148, 245, 85, 12, 125, 201, 123, 169, 10, 216, 184, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 9, 242, 139, 200, 171, 228, 159, 99, 159, 17, 253, 25, 85, 39, 206, 157, 237, 73, 166, 199, 115, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 23, 46, 186, 214, 221, 199, 60, 134, 214, 124, 95, 170, 113, 194, 69, 104, 156, 16, 121, 80, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 60, 250, 105, 140, 149, 57, 11, 168, 140, 27, 119, 149, 14, 50, 214, 194, 195, 20, 151, 164, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 98, 28, 129, 247, 221, 67, 167, 73, 87, 145, 42, 189, 40, 223, 198, 57, 185, 236, 222, 198, 156, 32, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 134, 163, 162, 117, 212, 148, 145, 27, 173, 117, 117, 108, 115, 23, 183, 200, 40, 104, 22, 120, 67, 40, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 172, 76, 139, 19, 73, 185, 181, 98, 152, 210, 210, 199, 143, 221, 165, 186, 50, 130, 28, 22, 83, 242, 0, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 209, 175, 214, 236, 14, 20, 17, 93, 159, 131, 195, 188, 185, 234, 135, 148, 95, 145, 81, 141, 244, 119, 64, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 10, 246, 27, 204, 167, 17, 153, 21, 181, 7, 100, 180, 171, 232, 101, 41, 121, 119, 117, 165, 241, 113, 149, 16, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 27, 162, 191, 208, 213, 255, 91, 34, 73, 61, 225, 214, 226, 126, 115, 215, 213, 83, 15, 109, 205, 250, 84, 0, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 65, 69, 183, 226, 133, 191, 152, 245, 109, 198, 173, 38, 77, 143, 8, 102, 229, 83, 233, 164, 160, 188, 116, 128, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 101, 151, 37, 219, 39, 47, 127, 50, 201, 56, 88, 111, 224, 242, 202, 128, 158, 168, 228, 13, 200, 235, 145, 160, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 138, 252, 239, 81, 240, 251, 94, 255, 123, 134, 110, 139, 217, 47, 125, 32, 198, 83, 29, 17, 59, 38, 118, 8, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 176, 222, 21, 147, 54, 157, 27, 95, 173, 52, 5, 23, 103, 189, 174, 52, 123, 243, 242, 42, 196, 248, 9, 197, 0, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 213, 21, 154, 248, 4, 68, 98, 55, 152, 129, 6, 93, 65, 173, 25, 193, 154, 240, 238, 181, 118, 54, 12, 54, 64, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 11, 250, 91, 1, 182, 5, 85, 122, 197, 126, 161, 71, 244, 146, 24, 96, 50, 1, 173, 42, 98, 211, 195, 143, 67, 208, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 32, 120, 225, 17, 195, 85, 108, 187, 111, 36, 204, 248, 219, 79, 60, 31, 65, 12, 58, 125, 196, 90, 57, 138, 98, 0, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 68, 151, 25, 86, 52, 42, 199, 234, 74, 238, 0, 55, 18, 35, 11, 39, 17, 79, 73, 29, 53, 112, 199, 236, 250, 128, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 105, 188, 223, 171, 193, 53, 121, 228, 221, 169, 128, 68, 214, 171, 205, 240, 213, 163, 27, 100, 130, 204, 249, 232, 57, 32, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 144, 22, 11, 203, 88, 193, 108, 47, 10, 137, 240, 43, 6, 43, 96, 182, 133, 133, 241, 30, 209, 192, 28, 49, 35, 180, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 180, 27, 142, 190, 46, 241, 199, 58, 205, 44, 108, 53, 199, 182, 56, 228, 38, 231, 109, 102, 134, 48, 35, 61, 108, 161, 0, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 217, 34, 114, 109, 186, 174, 57, 9, 128, 119, 135, 67, 57, 163, 199, 29, 48, 161, 72, 192, 39, 188, 44, 12, 199, 201, 64, 0, 0, 0]),
    f256::from_be_bytes([64, 12, 255, 107, 15, 9, 41, 89, 199, 75, 224, 149, 105, 20, 8, 12, 184, 228, 124, 201, 154, 240, 49, 171, 55, 15, 249, 187, 144, 0, 0, 0]),
    f256::from_be_bytes([64, 13, 35, 162, 233, 101, 185, 216, 28, 143, 108, 93, 97, 172, 133, 7, 243, 142, 205, 254, 0, 214, 31, 11, 2, 105, 252, 21, 58, 0, 0, 0]),
    f256::from_be_bytes([64, 13, 72, 139, 163, 191, 40, 78, 35, 179, 71, 116, 186, 23, 166, 73, 240, 114, 129, 125, 129, 11, 166, 205, 195, 4, 123, 26, 136, 128, 0, 0]),
    f256::from_be_bytes([64, 13, 110, 174, 140, 174, 242, 97, 172, 160, 25, 81, 232, 157, 143, 220, 108, 143, 33, 220, 225, 78, 144, 129, 51, 197, 153, 225, 42, 160, 0, 0]),
    f256::from_be_bytes([64, 13, 147, 45, 23, 237, 87, 125, 11, 228, 15, 211, 49, 98, 121, 233, 195, 217, 117, 42, 12, 209, 26, 80, 192, 91, 128, 44, 186, 164, 0, 0]),
    f256::from_be_bytes([64, 13, 183, 248, 93, 232, 173, 92, 78, 221, 19, 199, 253, 187, 24, 100, 52, 207, 210, 116, 144, 5, 96, 228, 240, 114, 96, 55, 233, 77, 0, 0]),
    f256::from_be_bytes([64, 13, 221, 246, 117, 98, 216, 179, 98, 148, 88, 185, 253, 41, 222, 125, 66, 3, 199, 17, 180, 6, 185, 30, 44, 142, 248, 69, 227, 160, 64, 0]),
    f256::from_be_bytes([64, 14, 2, 186, 9, 93, 199, 112, 29, 156, 183, 116, 62, 58, 43, 14, 73, 66, 92, 107, 16, 132, 51, 178, 219, 217, 91, 43, 174, 68, 40, 0]),
    f256::from_be_bytes([64, 14, 39, 104, 139, 181, 57, 76, 37, 3, 229, 81, 77, 200, 181, 209, 219, 146, 243, 133, 212, 165, 64, 159, 146, 207, 177, 246, 153, 213, 50, 0]),
    f256::from_be_bytes([64, 14, 77, 66, 174, 162, 135, 159, 46, 68, 222, 165, 161, 58, 227, 70, 82, 119, 176, 103, 73, 206, 144, 199, 119, 131, 158, 116, 64, 74, 126, 128]),
    f256::from_be_bytes([64, 14, 114, 73, 173, 37, 148, 195, 124, 235, 11, 39, 132, 196, 206, 11, 243, 138, 206, 64, 142, 33, 26, 124, 170, 178, 67, 8, 168, 46, 143, 16]),
    f256::from_be_bytes([64, 14, 150, 220, 24, 110, 249, 244, 92, 37, 205, 241, 101, 246, 1, 142, 240, 109, 129, 208, 177, 169, 97, 27, 213, 94, 211, 202, 210, 58, 50, 212]),
    f256::from_be_bytes([64, 14, 188, 147, 30, 138, 184, 113, 115, 47, 65, 109, 191, 115, 129, 242, 172, 136, 226, 68, 222, 19, 185, 98, 202, 182, 136, 189, 134, 200, 191, 137]),
];