Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/97: Рейтинг темы: голосов - 97, средняя оценка - 4.57
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
1

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

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

Как вернуть NaN и Infinity, проверить на NaN и Infinity?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2011, 08:08
Ответы с готовыми решениями:

Проверка double на NaN и Infinity
Как лучше проверить дабл на нотенамбер или бесконечность?

Как определить NAN INFINITY HUGE_VAL?
пробую собрать libxml2-2.9.8 старым компилятором (cl v 13.10.4035 for 80x86 из DDK) там в xpath.c...

Null,undefined,Nan,infinity
Всем привет! У меня 2 вопроса: 1)Перечисленные в заголовке значения яв-ся ли типами данных 2)В...

Обработка исключений при NaN, Infinity, by zero
Здравствуйте! Подскажите, пожалуйста, как сделать обработку исключений при этих значениях. Типа: ...

40
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 08:25 2
taras atavin, с помощью numeric_limits.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 08:27  [ТС] 3
А при чём здесь int?
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 08:57 4
Цитата Сообщение от taras atavin Посмотреть сообщение
А при чём здесь int?
Я что-то сказал про int?
0
367 / 219 / 78
Регистрация: 24.11.2009
Сообщений: 688
30.03.2011, 10:34 5
_isnan и _finite как вариант
1
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 10:55  [ТС] 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 секунд
А как вернуть такие значения?
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 11:05 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.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 11:44  [ТС] 8
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Vladimir., эти функции специфичны для MS.
А мне надо универсально.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
taras atavin, Вы хоть пробовали почитать описание numeric_limits?
Пробовал, но понял только, что с помощью этого прибамбаса можно проверить, поддерживает ли тип int код Infinity и убедиться в обратном.
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 11:51 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.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 13:09  [ТС] 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(), как написать условия для отлова в ифах этих значений?
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 13:10 11
taras atavin, дошло, наконец? Вы пробуйте в следующий раз читать то, что Вам пишут и изучить информацию в которую Вас тыкают носом.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 13:12  [ТС] 12
Как вернуть, я понял. А как проверить?

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

Подсказка: гугл знает ответ.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
30.03.2011, 13:22  [ТС] 14
NaN с погрешностью? Ну и ну!
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.03.2011, 13:55 15
Цитата Сообщение от taras atavin Посмотреть сообщение
NaN с погрешностью?
Я что-то сказал про сравнение c NaN?

Ладно... Раз Вам религия не позволяет вбить в гугле "NaN" и посмотреть первую же ссылку, то вот Вам цитата с Википедии:
Цитата Сообщение от ru.wikipedia.org
NaN не равен ни одному другому значению (даже самому себе[2]); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
18.07.2015, 07:27  [ТС] 16
А как проверить на inf? MSDN предлагает функцию _finite, но она специфична для их среды, кодоблоки её не понимают.
0
Комп_Оратор)
Эксперт по математике/физике
8421 / 4175 / 569
Регистрация: 04.12.2011
Сообщений: 12,394
Записей в блоге: 14
18.07.2015, 07:47 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();
.
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
18.07.2015, 08:46  [ТС] 18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Константы +-Infinity в C++ получить легко: std::numeric_limits<double>::infinity(); -std::numeric_limits<double>::infinity();
С ними можно сравнивать?
0
Комп_Оратор)
Эксперт по математике/физике
8421 / 4175 / 569
Регистрация: 04.12.2011
Сообщений: 12,394
Записей в блоге: 14
18.07.2015, 10:18 19
Цитата Сообщение от taras atavin Посмотреть сообщение
С ними можно сравнивать?
В первых двух примерах (втором точнее) показано как проверить ограниченно ли значение. Если не ограничено то бесконечность. Более того там два сравнения конкатенируются && то есть легко использовать любое из них для определения знака бесконечности. Сам факт сравнения с DBL_MAX говорит о том, что оно работает и когда сравниваемое значение равно (Вы не поверите) std::numeric_limits<double>::infinity()
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
18.07.2015, 11:06  [ТС] 20
А с
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
std::numeric_limits<double>::infinity()
и
C++
1
-std::numeric_limits<double>::infinity();
можно сравнивать?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2015, 11:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка -nan(ind) и nan
Доброго времени суток форумчане! Решаю задачу, в которой необходимо найти площадь треугольника по...

Как можно убрать Infinity?
package zad7; public class main { public static void main(String args) { ...

Как реализована Double.NaN != Double.NaN
public static void main(String args) { Float f1 = new Float(Float.NaN); Float f2...

infinity размер
Вопрос почему при заданной размерности я могу добавлять бесконечно? Оо class stack{ private:...


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

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

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