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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.88
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

30.03.2011, 08:08. Просмотров 8281. Ответов 40
Метки нет (Все метки)

Как вернуть NaN и Infinity, проверить на NaN и Infinity?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2011, 08:08     Как вернуть NaN и Infinity, проверить на NaN и Infinity?
Посмотрите здесь:

nan C++
C++ Проверка на NaN (С/С++)
C++ infinity размер
LU - разложение (выдает NaN) C++
При вычисление выдает nan C++
C++ max [NaN, число] vs max [число, NaN]
C++ Что такое nan?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 08:25     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #2
taras atavin, с помощью numeric_limits.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 08:27  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #3
А при чём здесь int?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 08:57     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #4
Цитата Сообщение от taras atavin Посмотреть сообщение
А при чём здесь int?
Я что-то сказал про int?
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
30.03.2011, 10:34     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #5
_isnan и _finite как вариант
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 10:55  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #6
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Я что-то сказал про int?
А о каком здесь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// numeric_limits example
#include <iostream>
#include <limits>
using namespace std;
int main () {
  cout << boolalpha;
  cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
  cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
  cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
  cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
  cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
  return 0;
 }
типе?

Добавлено через 1 минуту
Цитата Сообщение от Vladimir. Посмотреть сообщение
_isnan и _finite как вариант
Это проверка?

Добавлено через 50 секунд
А как вернуть такие значения?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 11:05     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #7
Цитата Сообщение от taras atavin Посмотреть сообщение
типе?
taras atavin, в аргументе шаблона задайте нужный Вам тип.
Цитата Сообщение от taras atavin Посмотреть сообщение
А как вернуть такие значения?
taras atavin, Вы хоть пробовали почитать описание numeric_limits?
C++
1
2
double doubleNaN = std::numeric_limits<double>::quiet_NaN();
int intInfinity = std::numeric_limits<int>::infinity();
Vladimir., эти функции специфичны для MS.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 11:44  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #8
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Vladimir., эти функции специфичны для MS.
А мне надо универсально.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
taras atavin, Вы хоть пробовали почитать описание numeric_limits?
Пробовал, но понял только, что с помощью этого прибамбаса можно проверить, поддерживает ли тип int код Infinity и убедиться в обратном.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 11:51     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #9
taras atavin, я сейчас матерится начну.

ЧИТАТЬ ВНИМАТЕЛЬНО:
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
C++
1
2
double doubleNaN = std::numeric_limits<double>::quiet_NaN();
int intInfinity = std::numeric_limits<int>::infinity();
Цитата Сообщение от cplusplus.com
infinity() - Representation of positive infinity, if available.
quiet_NaN() - Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() - Representation of signaling "Not-a-Number", if available.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 13:09  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #10
А почему бесконечность то интовая? Может
C++
1
2
double doubleNaN = std::numeric_limits<double>::quiet_NaN();
double intInfinity = std::numeric_limits<double>::infinity();
?

Добавлено через 14 минут
И проверку как сделать?
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
typedef double (*dp)(double);
double d(dp f, double x, double dx)
{
 double result, d,oldresult;
 for (result=std::numeric_limits<double>::quiet_NaN(), d=1.0; d!=0.0; dx/=2)
 {
  if (...)
  {
   return std::numeric_limits<double>::quiet_NaN();
  }
  if (...)
  {
   return std::numeric_limits<double>::infinity();
  }
  oldresult=result;
  result=(f(x+dx)-f(x-dx))/(2*dx);
  if (/*Как написать условие oldresult!=NaN?*/)
  {
   d=oldresult-result;
  }
  else
  {
   d=1.0;
  }
 }
 return result;
}
. Дальше, вернула эта функция std::numeric_limits<double>::quiet_NaN(), или std::numeric_limits<double>::infinity(), как написать условия для отлова в ифах этих значений?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 13:10     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #11
taras atavin, дошло, наконец? Вы пробуйте в следующий раз читать то, что Вам пишут и изучить информацию в которую Вас тыкают носом.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 13:12  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #12
Как вернуть, я понял. А как проверить?

Добавлено через 56 секунд
Неужели
C++
1
2
3
4
if (y==std::numeric_limits<double>::quiet_NaN())
{
 ...
}
?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 13:17     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #13
Цитата Сообщение от taras atavin Посмотреть сообщение
Неужели
Не угадали. Числа с плавающий точкой так не сравниваются, нужно учитывать погрешность.

Подсказка: гугл знает ответ.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2011, 13:22  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #14
NaN с погрешностью? Ну и ну!
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 13:55     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #15
Цитата Сообщение от taras atavin Посмотреть сообщение
NaN с погрешностью?
Я что-то сказал про сравнение c NaN?

Ладно... Раз Вам религия не позволяет вбить в гугле "NaN" и посмотреть первую же ссылку, то вот Вам цитата с Википедии:
Цитата Сообщение от ru.wikipedia.org
NaN не равен ни одному другому значению (даже самому себе[2]); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.07.2015, 07:27  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #16
А как проверить на inf? MSDN предлагает функцию _finite, но она специфична для их среды, кодоблоки её не понимают.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6348 / 2995 / 295
Регистрация: 04.12.2011
Сообщений: 8,031
Записей в блоге: 3
18.07.2015, 07:47     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #17
taras atavin, вот давненько смотрел, правда, но проверял вроде:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//http://www.johndcook.com/IEEE_exceptions_in_cpp.html
 
bool IsNumber(double x) 
    {
        // This looks like it should always be true, 
        // but it's false if x is a NaN.
        return (x == x); 
    }
 
//Here DBL_MAX is a constant defined in float.h as the largest double that can be represented.
 
bool IsFiniteNumber(double x) 
    {
        return (x <= DBL_MAX && x >= -DBL_MAX); 
    }   
 
непрохождение первого теста говорит о том что x не число (например результат ln(-1))
непрохождение второго - о том, что x бесконечность (+ или -) в зависимости от знаков операндов в операции в которой получен результат. 
 
To get more detail about the type of a floating point number, there is a function _fpclass on Windows and a corresponding function fp_class_d on Linux. I have not been able to get the corresponding Linux code to work and so I'll stick to what I've tested and just talk about Windows from here on out.
The Windows function _fpclass returns one of the following values:
 
    _FPCLASS_SNAN   // signaling NaN
        _FPCLASS_QNAN   // quiet NaN
        _FPCLASS_NINF   // negative infinity
        _FPCLASS_NN     // negative normal
        _FPCLASS_ND     // negative denormal
        _FPCLASS_NZ     // -0
        _FPCLASS_PZ     // +0
        _FPCLASS_PD     // positive denormal
        _FPCLASS_PN     // positive normal
        _FPCLASS_PINF   // positive infinity  
 
The following code illustrates which kinds of operations result in which kinds of numbers. To port this code to Linux, the FPClass function would need to use fp_class_d and its corresponding constants. 
 
 
    #include <cfloat>
        #include <iostream>
        #include <sstream>
        #include <cmath>
 
        using namespace std;
 
        string FPClass(double x)
        {
            int i = _fpclass(x);
            string s;
            switch (i)
            {
            case _FPCLASS_SNAN: s = "Signaling NaN";                break;
            case _FPCLASS_QNAN: s = "Quiet NaN";                    break; 
            case _FPCLASS_NINF: s = "Negative infinity (-INF)";     break; 
            case _FPCLASS_NN:   s = "Negative normalized non-zero"; break;
            case _FPCLASS_ND:   s = "Negative denormalized";        break; 
            case _FPCLASS_NZ:   s = "Negative zero (-0)";           break; 
            case _FPCLASS_PZ:   s = "Positive 0 (+0)";              break; 
            case _FPCLASS_PD:   s = "Positive denormalized";        break; 
            case _FPCLASS_PN:   s = "Positive normalized non-zero"; break; 
            case _FPCLASS_PINF: s = "Positive infinity (+INF)";     break;
            }
            return s;
        }
 
        string HexDump(double x)
        {
            unsigned long* pu;
            pu = (unsigned long*)&x;
            ostringstream os;
            os << hex << pu[0] << " " << pu[1];
            return os.str();
        }
 
        // ----------------------------------------------------------------------------
        int main()
        {
            double x, y, z;
 
            cout << "Testing z = 1/0\n";
            // cannot set x = 1/0 directly or would produce compile error.
            x = 1.0; y = 0; z = x/y;
            cout << "z = " << x/y << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = -1/0\n";
            x = -1.0; y = 0; z = x/y;
            cout << "z = " << x/y << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = sqrt(-1)\n";
            x = -1.0;
            z = sqrt(x);
            cout << "z = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = log(-1)\n";
            x = -1.0;
            z = sqrt(x);
            cout << "z = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting overflow\n";
            z = DBL_MAX;
            cout << "z = DBL_MAX = " << z; 
            z *= 2.0;
            cout << "; 2z = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting denormalized underflow\n";
            z = DBL_MIN;
            cout << "z = DBL_MIN = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
            z /= pow(2.0, 52);
            cout << "z = DBL_MIN / 2^52= " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
            z /= 2;
            cout << "z = DBL_MIN / 2^53= " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = +infinity + -infinty\n";
            x = 1.0; y = 0.0; x /= y; y = -x;
            cout << x << " + " << y << " = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = 0 * infinity\n";
            x = 1.0; y = 0.0; x /= y; z = 0.0*x;
            cout << "x = " << x << "; z = 0*x = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting 0/0\n";
            x = 0.0; y = 0.0; z = x/y;
            cout << "z = 0/0 = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting z = infinity/infinity\n";
            x = 1.0; y = 0.0; x /= y; y = x; z = x/y;
            cout << "x = " << x << "; z = x/x = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting x fmod 0\n";
            x = 1.0; y = 0.0; z = fmod(x, y);
            cout << "fmod(" << x << ", " << y << ") = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nTesting infinity fmod x\n";
            y = 1.0; x = 0.0; y /= x; z = fmod(y, x);
            cout << "fmod(" << y << ", " << x << ") = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            cout << "\nGetting cout to print QNAN\n";
            unsigned long nan[2]={0xffffffff, 0x7fffffff};
            z = *( double* )nan;
            cout << "z = " << z << "\n";
            cout << HexDump(z) << " _fpclass(z) = " << FPClass(z) << "\n";
 
            return 0;
        }      
 
 
немного о представлении:
// numeric_limits_infinity.cpp
// compile with: /EHsc
#include <iostream>
#include <limits>
 
using namespace std;
 
int main( )
{
   cout << numeric_limits<float>::has_infinity <<endl;
   cout << numeric_limits<double>::has_infinity<<endl;
   cout << numeric_limits<long double>::has_infinity <<endl;
   cout << numeric_limits<int>::has_infinity <<endl;
   cout << numeric_limits<__int64>::has_infinity <<endl;
 
   cout << "The representation of infinity for type float is: "
        << numeric_limits<float>::infinity( ) <<endl;
   cout << "The representation of infinity for type double is: "
        << numeric_limits<double>::infinity( ) <<endl;
   cout << "The representation of infinity for type long double is: "
        << numeric_limits<long double>::infinity( ) <<endl;
}
 
и 
Константа NaN смысла не имеет: все равно сравнивать значения с ней нельзя.
 
Константы +-Infinity в C++ получить легко:
 
std::numeric_limits<double>::infinity();
-std::numeric_limits<double>::infinity();
.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.07.2015, 08:46  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Константы +-Infinity в C++ получить легко: std::numeric_limits<double>::infinity(); -std::numeric_limits<double>::infinity();
С ними можно сравнивать?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6348 / 2995 / 295
Регистрация: 04.12.2011
Сообщений: 8,031
Записей в блоге: 3
18.07.2015, 10:18     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #19
Цитата Сообщение от taras atavin Посмотреть сообщение
С ними можно сравнивать?
В первых двух примерах (втором точнее) показано как проверить ограниченно ли значение. Если не ограничено то бесконечность. Более того там два сравнения конкатенируются && то есть легко использовать любое из них для определения знака бесконечности. Сам факт сравнения с DBL_MAX говорит о том, что оно работает и когда сравниваемое значение равно (Вы не поверите) std::numeric_limits<double>::infinity()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2015, 11:06     Как вернуть NaN и Infinity, проверить на NaN и Infinity?
Еще ссылки по теме:

C++ Проверка double на NaN и Infinity
Как присвоить переменной Double значение NaN? C++
Вывод nan при расчете C++
C++ Интегрирования трапециями. Ошибка -nan(ind)
C++ Nan после вычисления

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.07.2015, 11:06  [ТС]     Как вернуть NaN и Infinity, проверить на NaN и Infinity? #20
А с
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
std::numeric_limits<double>::infinity()
и
C++
1
-std::numeric_limits<double>::infinity();
можно сравнивать?
Yandex
Объявления
18.07.2015, 11:06     Как вернуть NaN и Infinity, проверить на NaN и Infinity?
Ответ Создать тему
Опции темы

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