Как переменную типа long double обозначить как переполненную?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 22.09.15 13:32
Оценка:
Есть переменная var типа long double .
Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?

И чему равно максимально возможное и минимально возможное значение переменных типа long double?

Среды разработки -- Visual C++ 2008 и Visual C++ 2012 .
1613 г. = 2024 г.
Re: Как переменную типа long double обозначить как переполненную?
От: smeeld  
Дата: 22.09.15 13:40
Оценка: -1 :)
Здравствуйте, RussianFellow, Вы писали:

RF>Есть переменная var типа long double .

RF>Можно ли как-то программным способом обозначить эту переменную как переполненную (значение равно NaN)? Если да, то как это можно сделать?

Если програмно, то ввести свой тип и определить собственный критерий его переполненности, который может
быть каким угодно

struct LongDouble{
long double variable;
bool overflow;
bool isOverflow () const;
.....
};

RF>И чему равно максимально возможное и минимально возможное значение переменных типа long double?


Определятся спекой CPU.
Re: std::numeric_limits<T>()
От: Qbit86 Кипр
Дата: 22.09.15 13:57
Оценка: +4
Здравствуйте, 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 обозначить как переполненную?
От: Igore Россия  
Дата: 22.09.15 14:38
Оценка:
Здравствуйте, 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  
Дата: 22.09.15 18:50
Оценка: +1
Здравствуйте, Igore, Вы писали:

I>C++11 уже показали, для 2008 студии придется как то так.


Там от С++11 только auto.
Такое будет работать даже в VS6.
    const long double nan = std::numeric_limits<long double>().quiet_NaN();
    const long double max = std::numeric_limits<long double>().max();
Re[3]: Как переменную типа long double обозначить как переполненную?
От: Igore Россия  
Дата: 23.09.15 06:47
Оценка:
Здравствуйте, wander, Вы писали:

W>Там от С++11 только auto.

Да, ты прав, в документации C++11 просто в глаза бросилось, а то что это до С++11 пропустил.

static T quiet_NaN(); (until C++11)

Re[2]: std::numeric_limits<T>()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 23.09.15 06:53
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>
Q>const auto nan = std::numeric_limits<long double>().quiet_NaN();
Q>


Ясно.
А как сделать так, чтобы функция, возвращающая значение типа long double, которое в зависимости от условия внутри этой функции может быть как определённым значением ( например, 3.14 ), так и иметь значения nan (неопределённое число) или infinity (бесконечность), находилась бы в одном файле, а вызывающая её функция находилась бы в другом файле и это бы всё нормально работало? (То есть чтобы из первой функции сосчитывались возвращаемые значения nan или infinity и с ними можно было бы работать в вызывающей функции?)
1613 г. = 2024 г.
Re[3]: std::numeric_limits<T>()
От: Igore Россия  
Дата: 23.09.15 07:24
Оценка:
Здравствуйте, 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;
}
Re[3]: std::numeric_limits<T>()
От: Qbit86 Кипр
Дата: 23.09.15 07:25
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А как сделать так, чтобы функция, возвращающая значение типа long double, которое в зависимости от условия внутри этой функции может быть как определённым значением ( например, 3.14 ), так и иметь значения nan (неопределённое число) или infinity (бесконечность), находилась бы в одном файле, а вызывающая её функция находилась бы в другом файле и это бы всё нормально работало?


// Файл MyLibrary.h

namespace MyNamespace
{
    long double MayReturnNan(int someArgument);
}


// Файл MyLibrary.cpp

#include "MyLibrary.h"

#include <limits>

namespace MyNamespace
{
    long double MayReturnNan(int someArgument)
    {
        return someArgument % 2 == 0
            ? std::numeric_limits<long double>().quiet_NaN()
            : 17.29L;
    }
}


// Файл Main.cpp

#include "MyLibrary.h"

#include <cmath>
#include <iostream>

int main()
{
    const auto valueOrNan = MyNamespace::MayReturnNan(42);
    std::cout << "Is nan: " << std::isnan(valueOrNan) << std::endl;

    return 0;
}
Глаза у меня добрые, но рубашка — смирительная!
Re: Как переменную типа long double обозначить как переполненную?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 23.09.15 11:05
Оценка:
Здравствуйте, RussianFellow, Вы писали:

FYI: В gcc опция -Ofast приводит к включению опции -ffinite-math-only, которая неявно полагает, что вещественные числа не могут принимать -INF, +INF, NAN. Поэтому некоторые стандартные функции перестают работать корректно, в частности сравнения. Для себя нашел выход в том, что написал свои функции is_nan(x).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.