HNumber Functions::Private::erfc( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 1 ) return HNumber::nan(); HNumber x = args[0]; HNumber result = HMath::erfc( x ); if ( result.isNan() && ! x.isNan() ) { f->setError( f->name(), Functions::tr( "underflow" ) ); } return result; }
void ResultDisplay::append(const QString& expression, const HNumber& value) { ++m_count; appendPlainText(expression); if (!value.isNan()) appendPlainText(QLatin1String("= ") + NumberFormatter::format(value)); appendPlainText(QLatin1String("")); // TODO: Refactor, this only serves to save a session. m_expressions.append(expression); if (value.isNan()) { m_results.append(""); } else { const char format = value.format() != 0 ? value.format() : 'e'; char* str = HMath::format(value, format, DECPRECISION); m_results.append(str); free(str); } }
HNumber function_absdev(Function* f, const Function::ArgumentList& args) { ENSURE_POSITIVE_ARGUMENT_COUNT(); HNumber mean = function_average(f, args); if (mean.isNan()) return HMath::nan(); HNumber acc = 0; for (int i = 0; i < args.count(); ++i) acc += HMath::abs(args.at(i) - mean); return acc / HNumber(args.count()); }
HNumber Functions::Private::lg( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 1 ) return HNumber::nan(); HNumber x = args[0]; HNumber result = HMath::lg( x ); if ( result.isNan() ) f->setError( f->name(), Functions::tr( "function undefined for specified argument" ) ); return result; }
HNumber Functions::Private::nPr( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 2 ) return HNumber::nan(); // n = args[0]; r = args[1] HNumber result = HMath::nPr( args[0], args[1] ); // FIX ME: overflow causes a NaN, too, so the message is sometimes // misleading if ( result.isNan() ) f->setError( f->name(), Functions::tr( "function undefined for specified arguments" ) ); return result; }
HNumber Functions::Private::poicdf( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 2 ) return HNumber::nan(); HNumber k = args[0]; HNumber l = args[1]; HNumber result = HMath::poissonCdf( k, l ); if ( result.isNan() ) f->setError( f->name(), Functions::tr( "function undefined for specified arguments" ) ); return result; }
HNumber Functions::Private::binomvar( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 2 ) return HNumber::nan(); HNumber n = args[0]; HNumber p = args[1]; HNumber result = HMath::binomialVariance( n, p ); if ( result.isNan() ) f->setError( f->name(), Functions::tr( "function undefined for specified arguments" ) ); return result; }
HNumber Functions::Private::hypervar( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 3 ) return HNumber::nan(); HNumber N = args[0]; HNumber M = args[1]; HNumber n = args[2]; HNumber result = HMath::hypergeometricVariance( N, M, n ); if ( result.isNan() ) f->setError( f->name(), Functions::tr( "function undefined for specified arguments" ) ); return result; }
HNumber Functions::Private::csc( Function * f, const QVector<HNumber> & args ) { if ( args.count() != 1 ) return HNumber::nan(); HNumber angle = args[0]; if ( f->functions()->angleMode() == 'd' ) angle = HMath::deg2rad( angle ); HNumber result = HMath::csc( angle ); if ( result.isNan() ) { f->setError( f->name(), Functions::tr( "function undefined for specified argument" ) ); return HNumber::nan(); } return result; }
void Editor::autoCalcSelection() { if (!m_isAutoCalcEnabled) return; const QString str = m_evaluator->autoFix(textCursor().selectedText()); if (str.isEmpty()) return; // Very short (just one token) and still no calculation, then skip. if (!m_isAnsAvailable) { const Tokens tokens = m_evaluator->scan(text()); if (tokens.count() < 2) return; } // Too short even after autofix? Don't bother either. const Tokens tokens = m_evaluator->scan(str); if (tokens.count() < 2) return; // Same reason as above, do not update "ans". m_evaluator->setExpression(str); const HNumber num = m_evaluator->evalNoAssign(); if (m_evaluator->error().isEmpty()) { if (num.isNan() && m_evaluator->isUserFunctionAssign()) { // Result is not always available when assigning a user function. const QString message = tr("Selection result: n/a"); emit autoCalcEnabled(message); } else { const QString message = tr("Selection result: <b>%1</b>").arg(NumberFormatter::format(num)); emit autoCalcEnabled(message); } } else emit autoCalcEnabled(m_evaluator->error()); }