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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

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

15.07.2011, 00:05. Просмотров 3385. Ответов 12
Метки нет (Все метки)

Использую функцию atof(); чтобы преобразовать строку в переменную типа double
Но иногда эта функция присваивает переменной double значение -1.#IND

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

Как узнать, что заданная переменная - это указатель? - C++
Здравствуйте, подскажите пожалуйста - Как узнать что, какая то, переменная это указатель? Например: int *p = new int; Как...

Как сделать так что бы выводило не -1.#IND - C++
#include<iostream> #include<math.h> using namespace std; class A { double x,y,z; double b; public: void...

Подскажите что это за символы 1#IND - C++
В консоли при нахождения определителя вылезло -1#IND что это такое?

Как узнать содержит ли переменная типа string определенные слова - C++
Нужно узнать содержит ли переменная типа string определенные слова. Пример: Если в переменной есть слово "кто" и "ты" ...

-1.#IND в выводе. Что означает в контексте вычислительной математики? - C++
Добрый день, господа программисты! На паре по вычислительной математике преподаватель поставил задачу написать стандартную программу,...

Переменная вдруг становится равна -1 - C++
#include <fstream> #include <queue> #include <vector> #include <cstdlib> using namespace std; ifstream in ("input.txt"); ...

12
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
15.07.2011, 00:24 #2
посмотри ф-цию _fpclass(double) из float.h
1
Ma3a
Эксперт С++
618 / 462 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.07.2011, 00:34 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
#include <limits>
bool isMinusInf(double x)
    {
    return x == -std::numeric_limits<double>::infinity();
    }
3
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
15.07.2011, 00:46 #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;
}
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
15.07.2011, 19:22  [ТС] #5
Paporotnik,
посмотри ф-цию _fpclass(double) из float.h
посматрел только непонятно вроде функция возвращает значение типо int но нигде не документировано что какая цифра значит
то есть у меня при ошибке -1.#IND возвращет 2
в остальных случаях или 64 или 256
как с ней работать непонятно нужен пример в коде

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

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

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

Не по теме:

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

0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
15.07.2011, 19:32 #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)
0
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
15.07.2011, 19:44 #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;

но лучше обрати внимание на посты выше. лучше найти способ избежать получения такого значения, или хотя бы понять причину возникновения, чем так грубо приводить к нулю.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
15.07.2011, 19:45 #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 секунд
опять опоздал...
2
Ma3a
Эксперт С++
618 / 462 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.07.2011, 19:49 #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();
    }
2
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
15.07.2011, 20:38 #13
Вот ещё бы посмотреть на ту строку, для которой atof выдаёт в результате NAN (-1.#IND)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2011, 20:38
Привет! Вот еще темы с ответами:

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Когда приравниваю переменную к функции, переменная становится равна нулю - C++
Есть функция, которая считает выражение и возвращает результат. И есть переменная, которая к этой функции приравнивается. По отдельности...

Чему будет равна переменная после выполнения следующего фрагмента программы? - C++
Пожалуйста, очень прошу помогите с тестами(( 2)Чему равна переменная m при p = 32 и p1 = 9 после выполнения следующего фрагмента...

Как узнать, что в ком порт что-то записалось? - C++
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
15.07.2011, 20:38
Ответ Создать тему
Опции темы

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