QVariant RootsModel::data(const QModelIndex &index, int role) const { int i = index.row(); if (role != Qt::DisplayRole && role < Qt::UserRole) return QVariant(); if (i < 0 || i > length) return QVariant(); else { rdpe_t root_module; mpc_rmod (root_module, m_roots.at(i)->value); int digits = (rdpe_Esp (root_module) - rdpe_Esp (m_roots.at(i)->radius)) / LOG2_10; char * buffer = NULL; switch (role) { case SHORT_APPROXIMATION: digits = 4; // fallthrough case Qt::DisplayRole: buffer = new char[2 * digits + 15]; if (m_roots[i]->get_imag_part() > 0) gmp_sprintf (buffer, "%.*Ff + %.*Ffi", digits, mpc_Re (m_roots[i]->value), digits, mpc_Im (m_roots[i]->value)); else gmp_sprintf (buffer, "%.*Ff %.*Ffi", digits, mpc_Re (m_roots[i]->value), digits, mpc_Im (m_roots[i]->value)); return QString(buffer); break; case STATUS: return QString(MPS_ROOT_STATUS_TO_STRING (m_roots[i]->status)); case RADIUS: return QString("%1").arg(m_roots[i]->get_radius()); case ROOT: return QVariant::fromValue((void*) m_roots[i]); default: qDebug() << "Invalid role"; return QVariant(); } } }
/** * @brief Print an approximation to stdout (or whatever the output * stream currently selected in the mps_context is). * * @param s A pointer to the current mps_context. * @param i The index of the approxiomation that shall be printed. * @param num The number of zero roots. */ MPS_PRIVATE void mps_outroot (mps_context * s, int i, int num) { long out_digit; out_digit = (long)(LOG10_2 * s->output_config->prec) + 10; /* print format header */ switch (s->output_config->format) { case MPS_OUTPUT_FORMAT_COMPACT: case MPS_OUTPUT_FORMAT_FULL: fprintf (s->outstr, "("); break; case MPS_OUTPUT_FORMAT_VERBOSE: fprintf (s->outstr, "Root(%d) = ", num); break; default: break; } /* print real part */ if (i == ISZERO || s->root[i]->attrs == MPS_ROOT_ATTRS_IMAG) fprintf (s->outstr, "0"); else mps_outfloat (s, mpc_Re (s->root[i]->mvalue), s->root[i]->drad, out_digit, true); /* print format middle part */ switch (s->output_config->format) { case MPS_OUTPUT_FORMAT_BARE: fprintf (s->outstr, " "); break; case MPS_OUTPUT_FORMAT_GNUPLOT: case MPS_OUTPUT_FORMAT_GNUPLOT_FULL: fprintf (s->outstr, "\t"); break; case MPS_OUTPUT_FORMAT_COMPACT: case MPS_OUTPUT_FORMAT_FULL: fprintf (s->outstr, ", "); break; case MPS_OUTPUT_FORMAT_VERBOSE: if (i == ISZERO || mpf_sgn (mpc_Im (s->root[i]->mvalue)) >= 0) fprintf (s->outstr, " + I * "); else fprintf (s->outstr, " - I * "); break; default: break; } /* print imaginary part */ if (i == ISZERO || s->root[i]->attrs == MPS_ROOT_ATTRS_REAL) fprintf (s->outstr, "0"); else mps_outfloat (s, mpc_Im (s->root[i]->mvalue), s->root[i]->drad, out_digit, s->output_config->format != MPS_OUTPUT_FORMAT_VERBOSE); /* If the output format is GNUPLOT_FORMAT_FULL, print out also the radius */ if (s->output_config->format == MPS_OUTPUT_FORMAT_GNUPLOT_FULL) { fprintf (s->outstr, "\t"); rdpe_out_str_u (s->outstr, s->root[i]->drad); fprintf (s->outstr, "\t"); rdpe_out_str_u (s->outstr, s->root[i]->drad); } /* print format ending */ switch (s->output_config->format) { case MPS_OUTPUT_FORMAT_COMPACT: fprintf (s->outstr, ")"); break; case MPS_OUTPUT_FORMAT_FULL: fprintf (s->outstr, ")\n"); if (i != ISZERO) { rdpe_outln_str (s->outstr, s->root[i]->drad); fprintf (s->outstr, "Status: %s, %s, %s\n", MPS_ROOT_STATUS_TO_STRING (s->root[i]->status), MPS_ROOT_ATTRS_TO_STRING (s->root[i]->attrs), MPS_ROOT_INCLUSION_TO_STRING (s->root[i]->inclusion)); } else fprintf (s->outstr, " 0\n ---\n"); break; default: break; } fprintf (s->outstr, "\n"); /* debug info */ if (s->DOLOG) { if (i == ISZERO) fprintf (s->logstr, "zero root %-4d = 0", num); else { fprintf (s->logstr, "Root %-4d = ", i); mpc_out_str_2 (s->logstr, 10, 0, 0, s->root[i]->mvalue); fprintf (s->logstr, "\n"); fprintf (s->logstr, " Radius = "); rdpe_outln_str (s->logstr, s->root[i]->drad); fprintf (s->logstr, " Prec = %ld\n", (long)(mpc_get_prec (s->root[i]->mvalue) / LOG2_10)); fprintf (s->logstr, " Approximation = %s\n", MPS_ROOT_STATUS_TO_STRING (s->root[i]->status)); fprintf (s->logstr, " Attributes = %s\n", MPS_ROOT_ATTRS_TO_STRING (s->root[i]->attrs)); fprintf (s->logstr, " Inclusion = %s\n", MPS_ROOT_INCLUSION_TO_STRING (s->root[i]->inclusion)); fprintf (s->logstr, "--------------------\n"); } } }