Example #1
0
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);
    }
}
Example #3
0
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());
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
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;
}
Example #10
0
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());
}