класс двойного типа в переполнении стека

После многих проблем, связанных с переменными двойного типа, таких как тестирование на равенство и деление на ноль, я подумал о создании класса для обработки двойных значений и попытался плавно переключать внутренние двойники, которые мы регулярно используем с новым классом. это не подходит полностью, хотя. вот мой класс:

class HDouble
{
//private:
public:
double dValue;
static const double dEpsilon;HDouble()
{
dValue = 0.0;
}

HDouble(double OtherValue)
{
if (IsNaN(OtherValue))
{
assert(0);
}
dValue = OtherValue;
}

const HDouble& operator=(const HDouble& OtherValue)
{
if (this == &OtherValue)      // Same object?
return *this;

if (IsNaN(OtherValue.dValue))
{
assert(0);
}
dValue = OtherValue.dValue;
return *this;
}

const HDouble& operator=(const double& OtherValue)
{
dValue = OtherValue;
return *this;
}
bool operator==(const HDouble& OtherValue)
{
return (abs(dValue - OtherValue.dValue) < dEpsilon);
}

//////////////////////////////////////////////////////////////////////////
const HDouble& operator++()
{
dValue++;
return *this;
}
const HDouble& operator++(int dummy)
{
dValue++;
return *this;
}
const HDouble& operator--()
{
dValue--;
return *this;
}
const HDouble& operator--(int dummy)
{
dValue--;
return *this;
}//////////////////////////////////////////////////////////////////////////
HDouble operator*(const HDouble& OtherValue)
{
HDouble Result = *this;
Result *= OtherValue;
return Result;
}
HDouble operator*(const double& OtherValue)
{
HDouble Result = *this;
Result *= OtherValue;
return Result;
}

HDouble operator/(const HDouble& OtherValue)
{
HDouble Result = *this;
Result /= OtherValue;
return Result;
}
HDouble operator/(const double& OtherValue)
{
HDouble Result = *this;
Result /= OtherValue;
return Result;
}

HDouble operator+(const HDouble& OtherValue)
{
HDouble Result = *this;
Result += OtherValue;
return Result;
}
HDouble operator+(const double& OtherValue)
{
HDouble Result = *this;
Result += OtherValue;
return Result;
}

HDouble operator-(const HDouble& OtherValue)
{
HDouble Result = *this;
Result -= OtherValue;
return Result;
}
HDouble operator-(const double& OtherValue)
{
HDouble Result = *this;
Result -= OtherValue;
return Result;
}

//////////////////////////////////////////////////////////////////////////
HDouble& operator*=(const double& OtherValue)
{
dValue *= OtherValue;
return *this;
}
HDouble& operator*=(const HDouble& OtherValue)
{
dValue *= OtherValue.dValue;
return *this;
}

HDouble& operator+=(const HDouble& OtherValue)
{
dValue += OtherValue.dValue;
return *this;
}
HDouble& operator+=(const double& OtherValue)
{
dValue += OtherValue;
return *this;
}HDouble& operator-=(const double& OtherValue)
{
dValue -= OtherValue;
return *this;
}
HDouble& operator-=(const HDouble& OtherValue)
{
dValue -= OtherValue.dValue;
return *this;
}

HDouble& operator/=(const double& OtherValue)
{
dValue /= OtherValue;
return *this;
}
HDouble& operator/=(const HDouble& OtherValue)
{
dValue /= OtherValue.dValue;
return *this;
}
//////////////////////////////////////////////////////////////////////////inline bool IsNaN(double d)
{
if (!(d >= DBL_MIN && d <= DBL_MAX))
{
return true;
}
else
return false;
}
};

одна проблема похожа на функцию, которая уже существует, например, вызывает функцию cos () и ожидает двойную функцию. есть ли способ для моего объекта класса распасться до внутреннего двойного при необходимости? Благодарю.

постскриптум Мой класс должен легко соответствовать существующему коду. не могу изменить это. все, что я могу сделать, это искать и заменять double на HDouble.

0

Решение

Да, добавьте оператор преобразования в свой класс: operator double() { return dValue; } в ваш класс. Таким образом, ваш HDouble будет преобразован в двойной, когда вы передадите его cos,

Кроме того, вы реализовали все свои операторы как функции-члены. Я хотел бы предложить прочитать о перегрузка оператора.

0

Другие решения

Вы можете добавить метод для возврата double:

double value()
{
return dValue;
}
0

Вам нужно добавить конструктор копирования и оператор преобразования в свой класс, а также переместить член данных класса в private:

class HDouble
{
private:
double dValue;

public:
static const double dEpsilon;

HDouble()
{
dValue = 0.0;
}

HDouble(double OtherValue)
{
if (IsNaN(OtherValue))
{
assert(0);
}
dValue = OtherValue;
}

HDouble(const HDouble &src)
{
dValue = src.dValue;
}

...

operator double() const
{
return dValue;
}

...
};
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector