#include #include #include #include #include #include int main(int argc, char *argv[]) { double resamp_ratio = strtod(argv[1], NULL); double relative_rate = 1/resamp_ratio; std::cout.precision(std::numeric_limits::max_digits10); //--------------------------------------------------------------------- // Using MPIR's C++ interface static const mpq_class one_half(1,2); mpq_class resamp_ratio_q(resamp_ratio); mpq_class relative_rate_q(relative_rate); //ratio.canonicalize(); std::cout << "Resample ratio: " << resamp_ratio << std::endl; std::cout << "Resample ratio: " << resamp_ratio_q << std::endl; std::cout << "Numerator: " << resamp_ratio_q.get_num().get_ui() << std::endl; std::cout << "Denominator: " << resamp_ratio_q.get_den().get_ui() << std::endl; std::cout << std::endl; std::cout << "Relative rate: " << relative_rate << std::endl; std::cout << "Relative rate: " << relative_rate_q << std::endl; std::cout << "Numerator: " << relative_rate_q.get_num().get_ui() << std::endl; std::cout << "Denominator: " << relative_rate_q.get_den().get_ui() << std::endl; std::cout << std::endl; #if 0 //mpz_class offset(0x0800000000000003); uint64_t offset = 0x0800000000000003; mpq_class scaled = offset*ratio; mpz_class rscaled(scaled + one_half); mpz_class rscaled2; rscaled2 = offset * ratio + one_half; rscaled2 = offset * ratio + one_half + 2; std::cout << "Offset: " << offset << std::endl; std::cout << "Scaled offset: " << scaled << std::endl; std::cout << "Rounded scaled offset: " << rscaled << std::endl; std::cout << "Rounded scaled offset2: " << rscaled2 << std::endl; uint64_t rscaledint = rscaled.get_ui(); std::cout << "Native rounded scaled offset: " << rscaledint << std::endl; #endif exit(0); }