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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
29.07.2014, 17:20     Проверка double на NaN и Infinity #1
Как лучше проверить дабл на нотенамбер или бесконечность?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
29.07.2014, 17:34     Проверка double на NaN и Infinity #2
C++
1
2
3
int _isnan(
   double x 
);
определена в float.h
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.07.2014, 17:34     Проверка double на NaN и Infinity #3
std::isnan
std::isinf
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
29.07.2014, 17:38  [ТС]     Проверка double на NaN и Infinity #4
Jupiter, нет у меня такого VS2012
zss, а с бесконечностью как быть?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
29.07.2014, 17:44     Проверка double на NaN и Infinity #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;
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
29.07.2014, 18:02     Проверка double на NaN и Infinity #6
Цитата Сообщение от m0 Посмотреть сообщение
проверить дабл на нотенамбер
так же можно проверить следующим образом:

C++
1
2
3
4
...
if(a != a)
   cout << "NaN"
...
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
29.07.2014, 22:16  [ТС]     Проверка double на NaN и Infinity #7
Цитата Сообщение от Jupiter Посмотреть сообщение
std::isnan
std::isinf
Меня бы это устроило, но почему в вс2013 это работает а в 2012 нет?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16834 / 5255 / 323
Регистрация: 30.03.2009
Сообщений: 14,152
Записей в блоге: 26
29.07.2014, 22:42     Проверка double на NaN и Infinity #8
А сие работает?
http://www.manpagez.com/man/3/isinf/
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
30.07.2014, 10:33  [ТС]     Проверка double на NaN и Infinity #9
Evg, нет такого в cmath в вс2012
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 11:20     Проверка double на NaN и Infinity
Еще ссылки по теме:

Почему перестает работать программа при замене double на long double? C++
Преобразовать 2 числа int в 1 число float(double) | double int1.int2 C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16834 / 5255 / 323
Регистрация: 30.03.2009
Сообщений: 14,152
Записей в блоге: 26
30.07.2014, 11:20     Проверка double на NaN и Infinity #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);
}
Yandex
Объявления
30.07.2014, 11:20     Проверка double на NaN и Infinity
Ответ Создать тему
Опции темы

Текущее время: 13:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru