/* * Fixed_Exponent_Power_Mod Constructor */ Fixed_Exponent_Power_Mod::Fixed_Exponent_Power_Mod(const BigInt& e, const BigInt& n, Usage_Hints hints) : Power_Mod(n, Usage_Hints(hints | EXP_IS_FIXED | choose_exp_hints(e, n))) { set_exponent(e); }
int main() { ulli number; uint new_exponent; printf(" ................\n"); printf("Enter 16 hexadeximal digits: "); scanf("%llx", &number); printf("Enter hexadeximal digits for new exponent: "); scanf("%x", &new_exponent); printf("\n"); printf("entered number (hex) %016llx\n", number); printf("number of exp bits are (dec) %16u\n", exp_bits(number)); printf("value of exponent is (hex) %16x\n", get_exponent(number)); printf("value of mantissa is (hex) %16llx\n", get_mantissa(number)); number = set_exponent(number, new_exponent); printf("\n"); printf("modified number (hex) %016llx\n", number); printf("number of exp bits are (dec) %16u\n", exp_bits(number)); printf("value of exponent is (hex) %16x\n", get_exponent(number)); printf("value of mantissa is (hex) %16llx\n", get_mantissa(number)); return 0; }
void WavpackFloatNormalize (int32_t *values, int32_t num_values, int delta_exp) { f32 *fvalues = (f32 *) values; int exp; if (!delta_exp) return; while (num_values--) { if ((exp = get_exponent (*fvalues)) == 0 || exp + delta_exp <= 0) *fvalues = 0; else if (exp == 255 || (exp += delta_exp) >= 255) { set_exponent (*fvalues, 255); set_mantissa (*fvalues, 0); } else set_exponent (*fvalues, exp); fvalues++; } }
static void float_valuesnowvx (WavpackStream *wps, int32_t *values, int32_t num_values) { while (num_values--) { int shift_count = 0, exp = wps->float_max_exp; f32 outval = 0; if (*values) { *values <<= wps->float_shift; if (*values < 0) { *values = -*values; set_sign (outval, 1); } if (*values >= 0x1000000) { while (*values & 0xf000000) { *values >>= 1; ++exp; } } else if (exp) { while (!(*values & 0x800000) && --exp) { shift_count++; *values <<= 1; } if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES)) *values |= ((1 << shift_count) - 1); } set_mantissa (outval, *values); set_exponent (outval, exp); } * (f32 *) values++ = outval; }
void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) { uint32_t crc = wps->crc_x; if (!bs_is_open (&wps->wvxbits)) { float_valuesnowvx (wps, values, num_values); return; } while (num_values--) { int shift_count = 0, exp = wps->float_max_exp; f32 outval = 0; uint32_t temp; if (*values == 0) { if (wps->float_flags & FLOAT_ZEROS_SENT) { if (getbit (&wps->wvxbits)) { getbits (&temp, 23, &wps->wvxbits); set_mantissa (outval, temp); if (exp >= 25) { getbits (&temp, 8, &wps->wvxbits); set_exponent (outval, temp); } set_sign (outval, getbit (&wps->wvxbits)); } else if (wps->float_flags & FLOAT_NEG_ZEROS) set_sign (outval, getbit (&wps->wvxbits)); } } else { *values <<= wps->float_shift; if (*values < 0) { *values = -*values; set_sign (outval, 1); } if (*values == 0x1000000) { if (getbit (&wps->wvxbits)) { getbits (&temp, 23, &wps->wvxbits); set_mantissa (outval, temp); } set_exponent (outval, 255); } else { if (exp) while (!(*values & 0x800000) && --exp) { shift_count++; *values <<= 1; } if (shift_count) { if ((wps->float_flags & FLOAT_SHIFT_ONES) || ((wps->float_flags & FLOAT_SHIFT_SAME) && getbit (&wps->wvxbits))) *values |= ((1 << shift_count) - 1); else if (wps->float_flags & FLOAT_SHIFT_SENT) { getbits (&temp, shift_count, &wps->wvxbits); *values |= temp & ((1 << shift_count) - 1); } } set_mantissa (outval, *values); set_exponent (outval, exp); } } crc = crc * 27 + get_mantissa (outval) * 9 + get_exponent (outval) * 3 + get_sign (outval); * (f32 *) values++ = outval; } wps->crc_x = crc; }