61 #define fl32_width 32 // Bit width of the Float32 62 #define fl32_mant_width 23 // Bit width of the encoded mantissa 63 #define fl32_exp_bias 127 // IEEE 754 Float32 exponent bias 64 #define fl32_NaN_exp 1 // Exponent encodings used for NaN 67 #define lin11_width 16 // Bit width of the Linear11 68 #define lin11_mant_width 11 // Bit width of the Linear11 mantissa 71 #define lin16_width 16 // Bit width of the Linear16 72 #define lin16_exp_width 5 // Bit width of the Linear16 exponent 79 #define fl32_exp_width (fl32_width - fl32_mant_width - 1) 80 #define fl32_max_exp ((1UL << fl32_exp_width) - 1) 81 #define fl32_max_p_exp (fl32_max_exp - fl32_exp_bias - fl32_NaN_exp) 84 #define fl32_sign_mask (1UL << (fl32_width - 1)) 85 #define fl32_exp_mask (((1UL << fl32_exp_width) - 1) << fl32_mant_width) 86 #define fl32_mant_mask ((1UL << fl32_mant_width) - 1) 93 #define lin11_mant_sign_mask (1UL << (lin11_mant_width - 1)) 94 #define lin11_mant_mask ((1UL << lin11_mant_width) - 1) 95 #define lin11_exp_width (lin11_width - lin11_mant_width) 96 #define lin11_exp_sign_mask (1UL << (lin11_exp_width - 1)) 97 #define lin11_exp_mask ((1UL << lin11_exp_width) - 1) 98 #define lin11_ieee_mant_width (lin11_mant_width-2) 99 #define lin11_ieee_mant_mask ((1UL << lin11_ieee_mant_width) - 1) 100 #define lin11_max_p_exp ((1UL << (lin11_exp_width - 1)) - 1) 101 #define lin11_max_n_exp (1UL << (lin11_exp_width - 1)) 102 #define lin11_bit_mask ((1UL << lin11_width) - 1) 105 #define lin11_den_n1 ((1UL<<(lin11_mant_width-1))|(1UL<<(lin11_mant_width-2))) 106 #define lin11_norm_n1 ( 1UL<<(lin11_mant_width-1)) 113 #define lin16_exp_sign_mask (1UL << (lin16_exp_width - 1)) 114 #define lin16_exp_mask ((1UL << lin16_exp_width) - 1) 115 #define lin16_ieee_mant_width (lin16_width-1) 116 #define lin16_ieee_mant_mask ((1UL << lin16_ieee_mant_width) - 1) 117 #define lin16_max_p_exp ((1UL << (lin16_exp_width - 1)) - 1) 118 #define lin16_max_n_exp (1UL << (lin16_exp_width - 1)) 119 #define lin16_max_value ((1UL << lin16_width) - 1) 123 #if !(fl32_mant_width >= lin16_ieee_mant_width) 124 #error The Float32 mantissa does not have enough bits for L16! 148 if (lin11_exp_sign != 0)
164 if (lin11_nmant == lin11_mant)
166 lin11_mant = lin11_nmant >> 1;
171 lin11_mant = lin11_nmant;
176 if (lin11_mant != 0 )
180 lin11_mant = lin11_mant << 1;
219 lin16_exp = (lin16_exp ^ ((
fl32_t) lin16_exp_mask)) + 1;
228 if (lin16_mant != 0 )
232 lin16_mant = lin16_mant << 1;
291 shift += (int) lin16_exp;
305 ushift = (unsigned) shift;
306 xout = (
lin16_t) (fl32_mant >> ushift);
307 rnd_msb = (((
fl32_t) (1)) << (ushift - 1));
308 tie_mask = ((((
fl32_t) (1)) << (ushift + 1)) - 1);
311 if (((rnd_msb & fl32_mant)!=0)&&((tie_mask & fl32_mant)!= rnd_msb))
364 lin11_mant = (
lin11_t) (fl32_mant >> mant_shift);
368 if (((rnd_msb & fl32_mant) !=0) && ((tie_mask & fl32_mant) != rnd_msb))
375 lin11_mant = lin11_mant >> 1;
389 lin11_mant = normal_n1;
399 lin11_mant = normal_n1;
409 if (lin11_mant == 0) lin11_exp = 0;
413 return ((
lin11_t)(lin11_exp | lin11_mant));
431 return *((
float *) &xout);
439 return *((
float *) &xout);
446 xin_fl32 = *((
fl32_t *) &xin);
454 xin_fl32 = *((
fl32_t *) &xin);
lin16_t float_to_lin16(float xin, lin16m_t vout_mode)
float lin16_to_float(lin16_t lin16_mant, lin16m_t vout_mode)
#define lin11_mant_sign_mask
lin16_t fl32_to_lin16(fl32_t xin, lin16_t lin16_exp)
#define lin16_exp_sign_mask
float lin11_to_float(lin11_t xin)
lin11_t fl32_to_lin11(fl32_t xin)
#define lin16_ieee_mant_mask
fl32_t lin16_to_fl32(lin16_t lin16_mant, lin16_t lin16_exp)
#define lin16_ieee_mant_width
#define lin11_ieee_mant_mask
fl32_t lin11_to_fl32(lin11_t xin)
#define lin11_ieee_mant_width
lin11_t float_to_lin11(float xin)
LTC PMBus Support: Math conversion routines.
#define lin11_exp_sign_mask