Есть переменная var типа long double .
Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?
И чему равно максимально возможное и минимально возможное значение переменных типа long double?
Среды разработки -- Visual C++ 2008 и Visual C++ 2012 .
1613 г. = 2024 г.
Re: Как переменную типа long double обозначить как переполненную?
Здравствуйте, RussianFellow, Вы писали:
RF>Есть переменная var типа long double . RF>Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?
Если програмно, то ввести свой тип и определить собственный критерий его переполненности, который может
быть каким угодно
struct LongDouble{
long double variable;
bool overflow;
bool isOverflow () const;
.....
};
RF>И чему равно максимально возможное и минимально возможное значение переменных типа long double?
Здравствуйте, RussianFellow, Вы писали:
RF>Как переменную типа long double обозначить как переполненную? RF>Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?
const auto nan = std::numeric_limits<long double>().quiet_NaN();
RF>И чему равно максимально возможное и минимально возможное значение переменных типа long double?
const auto max = std::numeric_limits<long double>().max();
Глаза у меня добрые, но рубашка — смирительная!
Re: Как переменную типа long double обозначить как переполненную?
Здравствуйте, RussianFellow, Вы писали:
RF>Есть переменная var типа long double . RF>Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?
RF>И чему равно максимально возможное и минимально возможное значение переменных типа long double?
RF>Среды разработки -- Visual C++ 2008 и Visual C++ 2012 .
C++11 уже показали, для 2008 студии придется как то так.
#include <math.h>
#ifdef _MSC_VER
#define INFINITY (DBL_MAX+DBL_MAX)
#define NAN (INFINITY-INFINITY)
#endif
#include <boost/math/special_functions/fpclassify.hpp>
void main()
{
long double nan = NAN;
std::cout << ( nan == nan ) << boost::math::isnan( nanTmp );
// false true
}
Re[2]: Как переменную типа long double обозначить как переполненную?
Здравствуйте, wander, Вы писали:
W>Там от С++11 только auto.
Да, ты прав, в документации C++11 просто в глаза бросилось, а то что это до С++11 пропустил.
Q>const auto nan = std::numeric_limits<long double>().quiet_NaN();
Q>
Ясно.
А как сделать так, чтобы функция, возвращающая значение типа long double, которое в зависимости от условия внутри этой функции может быть как определённым значением ( например, 3.14 ), так и иметь значения nan (неопределённое число) или infinity (бесконечность), находилась бы в одном файле, а вызывающая её функция находилась бы в другом файле и это бы всё нормально работало? (То есть чтобы из первой функции сосчитывались возвращаемые значения nan или infinity и с ними можно было бы работать в вызывающей функции?)
Здравствуйте, RussianFellow, Вы писали:
RF>Ясно. RF>А как сделать так, чтобы функция, возвращающая значение типа long double, которое в зависимости от условия внутри этой функции может быть как определённым значением ( например, 3.14 ), так и иметь значения nan (неопределённое число) или infinity (бесконечность), находилась бы в одном файле, а вызывающая её функция находилась бы в другом файле и это бы всё нормально работало? (То есть чтобы из первой функции сосчитывались возвращаемые значения nan или infinity и с ними можно было бы работать в вызывающей функции?)
Что? nan и infinity имеют тот же тип long double, и их можно так же возвращать, проверка только другая для nan существует std::isnan, а уж как функуию в отдельном файле определить тебе любой учебник поможет.
long double test( int i )
{
switch( i )
{
case 0: return 3.15;
case 1: return std::numeric_limits<long double>().quiet_NaN();
case 2: return std::numeric_limits<long double>().infinity();
default: return std::numeric_limits<long double>().max();
}
}
void main()
{
long double i1 = test( 0 );
long double i2 = test( 1 );
long double i3 = test( 2 );
long double i4 = test( 55 );
std::cout << i1 << i2 << i3 << i4 << std::endl;
}
Здравствуйте, RussianFellow, Вы писали:
RF>А как сделать так, чтобы функция, возвращающая значение типа long double, которое в зависимости от условия внутри этой функции может быть как определённым значением ( например, 3.14 ), так и иметь значения nan (неопределённое число) или infinity (бесконечность), находилась бы в одном файле, а вызывающая её функция находилась бы в другом файле и это бы всё нормально работало?
// Файл MyLibrary.hnamespace MyNamespace
{
long double MayReturnNan(int someArgument);
}
FYI: В gcc опция -Ofast приводит к включению опции -ffinite-math-only, которая неявно полагает, что вещественные числа не могут принимать -INF, +INF, NAN. Поэтому некоторые стандартные функции перестают работать корректно, в частности сравнения. Для себя нашел выход в том, что написал свои функции is_nan(x).