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

Как узнать что переменная равна -1.#IND - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
15.07.2011, 00:05     Как узнать что переменная равна -1.#IND #1
Использую функцию atof(); чтобы преобразовать строку в переменную типа double
Но иногда эта функция присваивает переменной double значение -1.#IND

Как проверить что значение переменной типа double равно -1.#IND ??
нужно вместо -1.#IND присвоить значение 0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2011, 00:05     Как узнать что переменная равна -1.#IND
Посмотрите здесь:

C++ Как узнать, что в ком порт что-то записалось?
C++ Странный ответ ="-1.#IND" что такое?
C++ Это обьект, переменная или что? Как то вовсе непонятно
Чему будет равна переменная после выполнения следующего фрагмента программы? C++
C++ Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
15.07.2011, 00:24     Как узнать что переменная равна -1.#IND #2
посмотри ф-цию _fpclass(double) из float.h
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.07.2011, 00:34     Как узнать что переменная равна -1.#IND #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
#include <limits>
bool isMinusInf(double x)
    {
    return x == -std::numeric_limits<double>::infinity();
    }
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.07.2011, 00:46     Как узнать что переменная равна -1.#IND #4
Если это результат переполнения (число не влезает в диапазон double) то отследить это можно используя для преобразования функцию strtod вместо atof и проверяя errno. В принципе atof тоже может устанавливать errno при ошибке, но это не гарантируется (у меня работает)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
int main()
{
    char const * str = "1e310";
    char * endp;
    double val;
    errno = 0;
    val = atof(str);
    if (errno != 0)
    {
        perror("Conversion error");
        if (errno == ERANGE)
        {
            val = 0;
        }
    }
 
    printf("Value: %lg\n", val);
    errno = 0;
    val = strtod(str, &endp);
    if (errno != 0)
    {
        perror("Conversion error");
        if (errno == ERANGE)
        {
            val = 0;
        }
    }
    printf("Value: %lg\n", val);
 
    return 0;
}
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
15.07.2011, 19:22  [ТС]     Как узнать что переменная равна -1.#IND #5
Paporotnik,
посмотри ф-цию _fpclass(double) из float.h
посматрел только непонятно вроде функция возвращает значение типо int но нигде не документировано что какая цифра значит
то есть у меня при ошибке -1.#IND возвращет 2
в остальных случаях или 64 или 256
как с ней работать непонятно нужен пример в коде

Ma3a
А если +1.#IND то какой будет код ?

grizlik78
я так и не понял будет работать с autof или нет, сам я врятли разберусь

нужен самый простой способ
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.07.2011, 19:24     Как узнать что переменная равна -1.#IND #6
nill, минуса перед std::numeric_limits не будет.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
15.07.2011, 19:27     Как узнать что переменная равна -1.#IND #7
Цитата Сообщение от nill Посмотреть сообщение
-1.#IND
- это минус бесконечность. Посмотрите в описании сопроцессора для интела - это порядок 1...1 и мантиса 0...0 (насколько я помню).
Если не знаете этих терминов - почитайте по архитектуре ЭВМ типы машинных данных.
Ma3a
15.07.2011, 19:28
  #8

Не по теме:

ValeryLaptev, точно, я только сейчас заметил, что IND, а не INF, тогда у меня фигня написана, это по-другому проверяться будет Вообще говоря, IND, насколько я помню, при каких-то ещё условиях может возникать, кроме переполнения

grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.07.2011, 19:32     Как узнать что переменная равна -1.#IND #9
nill, может и будет, но закладываться на это я бы не стал. Вот из стандарта C99:
7.20.1 Numeric conversion functions
The functions atof, atoi, atol, and atoll need not affect the value of the integer
expression errno on an error. If the value of the result cannot be represented, the
behavior is undefined.
То есть никто не требует устанавливать errno при ошибках для atof
И далее, 7.20.1.1 The atof function
The atof function converts the initial portion of the string pointed to by nptr to
double representation. Except for the behavior on error, it is equivalent to
C
1
strtod(nptr, (char **)NULL)
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
15.07.2011, 19:44     Как узнать что переменная равна -1.#IND #10
посматрел только непонятно вроде функция возвращает значение типо int но нигде не документировано что какая цифра значит
то есть у меня при ошибке -1.#IND возвращет 2
в остальных случаях или 64 или 256
как с ней работать непонятно нужен пример в коде
http://msdn.microsoft.com/en-us/library/39s1cck2.aspx
как работать? ну вроде очевидно
if (_fpclass(x)==2) y=0; else y=x;

но лучше обрати внимание на посты выше. лучше найти способ избежать получения такого значения, или хотя бы понять причину возникновения, чем так грубо приводить к нулю.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.07.2011, 19:45     Как узнать что переменная равна -1.#IND #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//#include<float.h>
double a=1, b=0;
double d = a/b;
int fpc = _fpclass(d);
switch(fpc){
    case    _FPCLASS_QNAN:
        puts("#IND (Indefinite aka Quiet NaN)");
        break;
    case    _FPCLASS_SNAN:
        puts("#NAN (Signaling NaN)");
        break;
    case    _FPCLASS_NINF:
        puts("-#INF (Negative infinity)");
        break;
    case    _FPCLASS_PINF:
        puts("+#INF (Positive infinity)");
        break;
//и т.д.
}
Добавлено через 40 секунд
опять опоздал...
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.07.2011, 19:49     Как узнать что переменная равна -1.#IND #12
исправляюсь

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <limits>
// -1.#IND
bool isnan(double x)
    {
    return x == std::numeric_limits<double>::quiet_NaN();
    }
// -1.#INF
bool minf(double x)
    {
    return x == -std::numeric_limits<double>::infinity();
    }
// +1.#INF
bool pinf(double x)
    {
    return x == std::numeric_limits<double>::infinity();
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2011, 20:38     Как узнать что переменная равна -1.#IND
Еще ссылки по теме:

C++ Подскажите что это за символы 1#IND
C++ Как сделать так что бы выводило не -1.#IND
C++ -1.#IND в выводе. Что означает в контексте вычислительной математики?

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.07.2011, 20:38     Как узнать что переменная равна -1.#IND #13
Вот ещё бы посмотреть на ту строку, для которой atof выдаёт в результате NAN (-1.#IND)
Yandex
Объявления
15.07.2011, 20:38     Как узнать что переменная равна -1.#IND
Ответ Создать тему
Опции темы

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