+ double Log10() const
+ {
+ mpz_t num; mpz_init(num); mpq_get_num(num, m_op);
+ mpz_t den; mpz_init(den); mpq_get_den(den, m_op);
+
+ double lognum = 0;
+ double logden = 0;
+ while (mpz_sizeinbase(num, 10) > 10)
+ {
+
+ mpz_div_ui(num, num, 1e10);
+ lognum += 10;
+ }
+ uint64_t n = mpz_get_ui(num);
+ if (n == 0)
+ {
+ return -INFINITY;
+ }
+ lognum += log(n)/log(10.0);
+ //Debug("%lu", mpz_get_ui(den));
+ while (mpz_sizeinbase(den, 10) > 10)
+ {
+ mpz_div_ui(den, den, 1e10);
+ logden += 10;
+ }
+ uint64_t d = mpz_get_ui(den);
+ // if d is zero, its been rounded down we hope
+ if (d != 0)
+ logden += log(d)/log(10.0);
+
+ return (lognum - logden);
+ }
+
+
+ bool Negative() const {return (mpz_sgn(mpq_numref(m_op)) < 0);}
+