C++ (Qt)struct NNumeric { ... static void InitLimits( void ) { mFloatMax = std::numeric_limits<float>::max(); } static float mFloatMax;};
#include <limits>#include <cmath>class NNumeric{public: inline NNumeric(double Value = 0) {this->data._isreal = true; this->setValue(Value); this->data._id = -1; this->data._constvalue = false; this->data._name = "";} inline NNumeric(const NNumeric& a) {this->setConstValue(a.data._constvalue); this->setID(a.data._id); this->setName(a.data._name); this->setIsReal(a.data._isreal); this->setValue(a.data._value);} inline double round() {return floor(this->Value() + 0.5);} inline double fractional() {return this->Value() < 0.0 ? this->Value() - ceil(this->Value()) : this->Value() - floor(this->Value());} inline double integer() {return this->Value() < 0.0 ? ceil(this->Value()) : floor(this->Value());} inline int ID() {return this->data._id;} inline void setID(int ID) {this->data._id = ID;} inline bool ConstValue() {return this->data._constvalue;} inline void setConstValue(bool ConstValue) {this->data._constvalue = ConstValue;} inline QString Name() {return this->data._name;} inline void setName(QString Name) {this->data._name = Name;} inline void setIsReal(bool IsReal) {this->data._isreal = IsReal;} //Если ложно, то значение принимается и выдается (при печати числа на экране) // с отсечение дробной части числа и соблюдением границ типа qint32. inline bool IsReal() const {return this->data._isreal;} inline void setValue(double Value) {if (!this->IsReal()) Value = this->CheckingInt32Borders(Value); else Value = this->CheckingFloatBorders(Value); this->data._value = Value;} inline double Value() const {return double(this->CheckingFloatBorders(this->data._value));} inline void operator=(const NNumeric& a) {this->setConstValue(a.data._constvalue); this->setID(a.data._id); this->setName(a.data._name); this->setIsReal(a.data._isreal); this->setValue(a.data._value);} inline operator QString() {return QString::number(this->data._value);} inline operator double() {return double(this->CheckingFloatBorders(this->Value()));} inline operator float() {return this->CheckingFloatBorders(this->Value());} inline operator qint32() {return this->CheckingInt32Borders(this->data._value);} inline void operator++(int) {if (!this->IsReal()) this->data._value = this->CheckingInt32Borders(this->data._value+1); else this->data._value = this->CheckingFloatBorders(this->data._value+1);} inline void operator--(int) {if (!this->IsReal()) this->data._value = this->CheckingInt32Borders(this->data._value-1); else this->data._value = this->CheckingFloatBorders(this->data._value-1);} inline bool operator==(const NNumeric& a) {return this->data._value == a.Value();} inline bool operator!=(const NNumeric& a) {return this->data._value != a.Value();} inline bool operator&&(const NNumeric& a) {return this->data._value && a.Value();} inline bool operator||(const NNumeric& a) {return this->data._value || a.Value();} inline bool operator<(const NNumeric& a) {return this->data._value < a.Value();} inline bool operator<=(const NNumeric& a) {return this->data._value <= a.Value();} inline bool operator>(const NNumeric& a) {return this->data._value > a.Value();} inline bool operator>=(const NNumeric& a) {return this->data._value >= a.Value();}private: inline long double Int32Max() const {return std::numeric_limits<qint32>::max();} inline long double Int32Min() const {return std::numeric_limits<qint32>::min();} inline long double FloatMax() const {return std::numeric_limits<float>::max();} inline long double FloatMin() const {return std::numeric_limits<float>::min();} inline float CheckingFloatBorders (double Value) const { //В этой функции +/-inf приравниваются к max и min границам. double d = fabs(Value); bool usign = Value >= 0.0; if (d >= this->FloatMax()) return (usign) ? this->FloatMax() : -this->FloatMax(); if (d <= this->FloatMin() && d > 0.0) return (usign) ? this->FloatMin() : -this->FloatMin(); return float(Value); } inline qint32 CheckingInt32Borders(double Value) const { if (Value >= Int32Max()) return Int32Max(); if (Value <= Int32Min()) return Int32Min(); return qint32(Value); } struct NData { //если идентификатор равен -1, значит это либо временная переменная, либо константное значение qint32 _id; //константные или временные значения имен не имеют, только переменные. QString _name; double _value; bool _isreal; //это указывает на константное значение bool _constvalue; }; NData data;};
if (!arg1.IsReal() && !arg2.IsReal()) {//здесь оба целые arg0.setIsReal(false); arg0.setValue(double(arg1) + double(arg2)); } else arg0 = double(arg1) + double(arg2);