// // This confidential and proprietary software may be used only as // authorised by a licensing agreement from ARM Limited // (C) COPYRIGHT 2020-2024 ARM Limited // ALL RIGHTS RESERVED // The entire notice above must be reproduced on all authorised // copies and copies may only be made to the extent permitted // by a licensing agreement from ARM Limited. fp64_t exp2(int n) { if (n < -1075) { return 0.0; // smaller than smallest denormal } REQUIRE(n <= 1023); fp64_t v = 1.0; while (n > 0) { v = v*2.0; n--; } while (n < 0) { v = v/2.0; n++; } return v; } int ilog2(fp64_t v) { REQURE(0 < v && v < infinity); int n = 0; while (v >= 2.0) { v = v/2.0; n++; } while (v < 1.0) { v = v*2.0; n--; } return n; } fp64_t normal_min() { switch (in_t) { case fp32_t: return exp2(-126); case bf16_t: return exp2(-126); case fp16_t: return exp2( -14); case fp8e4m3_t: return exp2(-6); case fp8e5m2_t: return exp2(-14); } } fp64_t normal_max() { switch (in_t) { case fp32_t: return exp2(128) - exp2(127-23); case bf16_t: return exp2(128) - exp2(127- 7); case fp16_t: return exp2( 16) - exp2( 15-10); case fp8e4m3_t: return exp2( 9) - exp2( 8-2); case fp8e5m2_t: return exp2( 16) - exp2( 15-2); } } // Number of fractional (mantissa bits) int normal_frac () { switch (in_t) { case fp32_t: return 23; case fp16_t: return 10; case bf16_t: return 7; case fp8e4m3_t: return 3; case fp8e5m2_t: return 2; } }