Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
#1

Проверка double на NaN и Infinity - C++

29.07.2014, 17:20. Просмотров 1605. Ответов 9
Метки нет (Все метки)

Как лучше проверить дабл на нотенамбер или бесконечность?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2014, 17:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка double на NaN и Infinity (C++):

Как присвоить переменной Double значение NaN? - C++
Есть переменная типа double. Как ей присвоить значение NaN?

Проверка на NaN (С/С++) - C++
Подскажите, пожалуйста, как проверить является ли вещественное число NaN'ом? Как вариант сделать побитовое умножение на маску... Но...

Как вернуть NaN и Infinity, проверить на NaN и Infinity? - C++
Как вернуть NaN и Infinity, проверить на NaN и Infinity?

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include <iostream> #include <cmath> using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Проверка double на переполнение - C++
Подскажите, пожалуйста, как проверить double на переполнение? Был такой вариант, но работает некорректно: template <class Type> ...

9
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,654
Завершенные тесты: 1
29.07.2014, 17:34 #2
C++
1
2
3
int _isnan(
   double x 
);
определена в float.h
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.07.2014, 17:34 #3
std::isnan
std::isinf
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
29.07.2014, 17:38  [ТС] #4
Jupiter, нет у меня такого VS2012
zss, а с бесконечностью как быть?
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,654
Завершенные тесты: 1
29.07.2014, 17:44 #5
А для infinity нашел такой способ
C++
1
2
3
4
5
6
#include <limits>
...
    double a=numeric_limits<double>::infinity();
    double b=numeric_limits<double>::infinity();
    if(a==b)
        cout<<"==" <<endl;
1
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 702
Завершенные тесты: 2
29.07.2014, 18:02 #6
Цитата Сообщение от m0 Посмотреть сообщение
проверить дабл на нотенамбер
так же можно проверить следующим образом:

C++
1
2
3
4
...
if(a != a)
   cout << "NaN"
...
1
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
29.07.2014, 22:16  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
std::isnan
std::isinf
Меня бы это устроило, но почему в вс2013 это работает а в 2012 нет?
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
29.07.2014, 22:42 #8
А сие работает?
http://www.manpagez.com/man/3/isinf/
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
30.07.2014, 10:33  [ТС] #9
Evg, нет такого в cmath в вс2012
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
30.07.2014, 11:20 #10
http://www.cplusplus.com/reference/cmath/isinf/

Судя по всему, сие есть часть стандарта C99 и C++11. Думаю, это объясняет разницу между msvs-2012 и msvs-2013: более ранняя версия не поддерживает c++11, а c99, насколько я слышал, они не поддерживают вообще

Добавлено через 12 минут
Вот реализация, выдранная из glibc-2.7 для i386. Можешь втащить к себе, если с библиотечной реализацией не разберёшься

C
typedef union
{
  double value;
  struct
  {
    u_int32_t lsw;
    u_int32_t msw;
  } parts;
} ieee_double_shape_type;
 
#define EXTRACT_WORDS(ix0,ix1,d) \
do {                             \
  ieee_double_shape_type ew_u;   \
  ew_u.value = (d);              \
  (ix0) = ew_u.parts.msw;        \
  (ix1) = ew_u.parts.lsw;        \
} while (0)
 
int
__isinf (double x)
{
        int32_t hx,lx;
        EXTRACT_WORDS(hx,lx,x);
        lx |= (hx & 0x7fffffff) ^ 0x7ff00000;
        lx |= -lx;
        return ~(lx >> 31) & (hx >> 30);
}
 
int
__isnan (double x)
{
    int32_t hx,lx;
    EXTRACT_WORDS(hx,lx,x);
    hx &= 0x7fffffff;
    hx |= (u_int32_t)(lx|(-lx))>>31;
    hx = 0x7ff00000 - hx;
    return (int)(((u_int32_t)hx)>>31);
}
0
30.07.2014, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 11:20
Привет! Вот еще темы с ответами:

Проверка переполнения double - C++
Добрый день! Подскажите пожалуйста, где можно почитать теорию. Нужно решить задачу, написать функции на С++, которые бы проверяли ...

Проверка числа типа double на чётность/нечётность - C++
В программе необходимо проверить число типа double на то, является оно четным или нет. Это возможно как-то сделать или нет? Обычный метод,...

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

infinity размер - C++
Вопрос почему при заданной размерности я могу добавлять бесконечно? Оо class stack{ private: int count; int *st; public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru