Пример #1
0
HNumber Functions::Private::average( Function *, const QVector<HNumber> & args )
{
  if ( args.count() <= 0 )
    return HNumber("NaN");

  HNumber result = args[0];
  for ( int c = 1; c < args.count(); c++ )
    result = result + args[c];
  result = result / HNumber(args.count());

  return result;
}
Пример #2
0
HNumber Functions::Private::bin( Function *, const QVector<HNumber> & args )
{
  if ( args.count() != 1 )
    return HNumber("NaN");

  HNumber result = args[0];
  result.setFormat( 'b' );
  return result;
}
Пример #3
0
HNumber function_geomean(Function* f, const Function::ArgumentList& args)
{
    ENSURE_POSITIVE_ARGUMENT_COUNT();

    HNumber result = std::accumulate(args.begin(), args.end(), HNumber(1),
                                     std::multiplies<HNumber>());

    if (result <= HNumber(0))
        return HNumber("NaN");

    if (args.count() == 1)
        return result;

    if (args.count() == 2)
        return HMath::sqrt(result);

    return HMath::exp(HMath::ln(result) / HNumber(args.count()));
}
Пример #4
0
BitWidget::BitWidget(int bitPosition, QWidget* parent)
    : QLabel(parent),
    m_state(false)
{
    setFixedSize(SizePixels, SizePixels);

    HNumber number(HMath::raise(HNumber(2), bitPosition));
    setToolTip(QString("2<sup>%1</sup> = %2")
        .arg(bitPosition)
        .arg(HMath::format(number, 'd')));
}
Пример #5
0
HNumber Functions::Private::product( Function *, const QVector<HNumber> & args )
{
  if ( args.count() <= 0 )
    return HNumber(0);

  HNumber result = args[0];
  for ( int c = 1; c < args.count(); c++ )
    result = result * args[c];

  return result;
}
Пример #6
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());
}
Пример #7
0
HNumber function_median(Function* f, const Function::ArgumentList& args)
{
    ENSURE_POSITIVE_ARGUMENT_COUNT();

    Function::ArgumentList sortedArgs = args;
    qSort(sortedArgs);

    if ((args.count() & 1) == 1)
        return sortedArgs.at((args.count() - 1) / 2);

    const int centerLeft = args.count() / 2 - 1;
    return (sortedArgs.at(centerLeft) + sortedArgs.at(centerLeft + 1)) / HNumber(2);
}
Пример #8
0
HNumber Functions::Private::geomean( Function *, const QVector<HNumber> & args )
{
  if ( args.count() <= 0 )
    return HNumber("NaN");

  HNumber result = args[0];

  for ( int c = 1; c < args.count(); c++ )
    result = result * args[c];

  if ( result <= HNumber(0))
    return HNumber("NaN");

  if ( args.count() == 1 )
    return result;

  if ( args.count() == 2 )
    return HMath::sqrt( result );

  result = HMath::exp( HMath::ln(result) / HNumber(args.count()) );

  return result;
}
Пример #9
0
HNumber Function::exec( const QVector<HNumber> & args )
{
  d->error = QString();
  if ( ! d->ptr )
  {
    setError( QString("error"), QString( Functions::tr(
                "cannot execute function %1") ).arg( name() ) );
    return HNumber(0);
  }

  if ( d->argc >= 0 && args.count() != d->argc )
  {
    if ( d->argc == 1 )
      setError( d->name, QString( Functions::tr(
                  "function accepts 1 argument" ) ) );
    else
      setError( d->name, QString( Functions::tr(
                  "function accepts %1 arguments" ) ).arg( d->argc ) );

    return HNumber(0);
  }

  return (*d->ptr)( this, args );
}
Пример #10
0
HNumber Functions::Private::sqrt( Function * f, const QVector<HNumber> & args )
{
  if ( args.count() != 1 )
    return HNumber::nan();

  HNumber num = args[0];
  if( num < HNumber(0) )
  {
    f->setError( f->name(), Functions::tr(
                    "function undefined for specified argument" ) );
    return HNumber::nan();
  }

  return HMath::sqrt( num );
}
Пример #11
0
HNumber function_round(Function* f, const Function::ArgumentList& args)
{
    ENSURE_EITHER_ARGUMENT_COUNT(1, 2);
    HNumber num = args.at(0);
    if (args.count() == 2) {
        HNumber argPrecision = args.at(1);
        if (argPrecision != 0) {
            if (!argPrecision.isInteger()) {
                f->setError(OutOfDomain);
                return HMath::nan();
            }
            int prec = argPrecision.toInt();
            if (prec)
                return HMath::round(num, prec);
            // The second parameter exceeds the integer limits.
            if (argPrecision < 0)
                return HNumber(0);
            return num;
        }
    }
    return HMath::round(num);
}
Пример #12
0
HNumber Functions::Private::round( Function * f, const QVector<HNumber> & args )
{
  int nArgs = args.count();

  if ( nArgs != 1 && nArgs != 2 )
  {
    f->setError( f->name(), Functions::tr(
                    "function requires 1 or 2 arguments" ) );
    return HNumber::nan();
  }

  HNumber num = args[0];

  if( nArgs == 2){

    int prec = 0;

    HNumber argprec = args[1];
    if (argprec != 0)
    {
      if( !argprec.isInteger() )
      {
        f->setError( f->name(), Functions::tr(
                        "function undefined for specified arguments" ) );
        return HNumber::nan();
      }
      if ((prec = argprec.toInt()) != 0)
        return HMath::round( num, prec );
      // the 2. parameter exceeds the integer limits
      if (argprec < 0)
        return HNumber(0);
      return num;
    }
  }
  return HMath::round( num );
}
Пример #13
0
HNumber function_average(Function* f, const Function::ArgumentList& args)
{
    ENSURE_POSITIVE_ARGUMENT_COUNT();
    return std::accumulate(args.begin(), args.end(), HNumber(0)) / HNumber(args.count());
}
Пример #14
0
HNumber function_xor(Function* f, const Function::ArgumentList& args)
{
    ENSURE_POSITIVE_ARGUMENT_COUNT();
    return std::accumulate(args.begin(), args.end(), HNumber(0),
                           std::mem_fun_ref(&HNumber::operator^));
}
Пример #15
0
HNumber function_bin(Function* f, const Function::ArgumentList& args)
{
    ENSURE_ARGUMENT_COUNT(1);
    return HNumber(args.at(0)).setFormat('b');
}
Пример #16
0
HNumber function_product(Function* f, const Function::ArgumentList& args)
{
    ENSURE_POSITIVE_ARGUMENT_COUNT();
    return std::accumulate(args.begin(), args.end(), HNumber(1), std::multiplies<HNumber>());
}