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

Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan - C++

Восстановить пароль Регистрация
 
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
15.05.2014, 23:48     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #1
Доброго времени суток! Помогите, пожалуйста, оптимизировать код. Дело в том, что компьютер при исчислениях ненадолго виснет и иногда выбивает число nan.
Сама функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float mySin(double xrad)
{
    double msin, del, x1, eps;
    int n;
    msin = xrad; //inital appropriation (початкове присвоєння)
    del = msin;
    n = 1;
    while (fabs(del)>=eps)
    {
        del = del*(-1*(xrad*xrad))/((n+1)*(n+2));
        msin = msin + del;
        n = n + 2;
    }
    return msin;
}
Вызываю ее так:
C++
1
2
3
4
5
6
7
x=x1;
while (x<=x2)
{
    xrad = (x*M_PI)/180.; //180. ~ 180.0 number is real not integer
    cout << mySin(xrad) << setw(15) << "\n";
    x=x+dx;
}
Добавлено через 2 минуты
Может ли быть проблема в слишком точном M_PI?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2014, 23:48     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan
Посмотрите здесь:

выбивает прогу при пробелах C++
Даны натуральное число n, действительные числа a1,...,an. Получить: max (-a1,a2,-a3,...,(-1)nan) C++
При вычисление выдает nan C++
C++ Выбивает при создании вектора
C++ max [NaN, число] vs max [число, NaN]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 23:52     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #2
Цитата Сообщение от Donville Посмотреть сообщение
Может ли быть проблема в слишком точном M_PI?
Как минимум проблема в том, что eps не инициализировано.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 00:11  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #3
Это лишь часть кода

Добавлено через 14 минут
Подскажите, что делать, пожалуйста.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.05.2014, 00:12     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #4
Цитата Сообщение от Donville Посмотреть сообщение
Это лишь часть кода
Т.е. eps на самом деле инициализировано?
Цитата Сообщение от Donville Посмотреть сообщение
Подскажите, что делать, пожалуйста.
Приводить весь код так как он есть.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 00:15  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #5
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
#include <iostream>
#include <cstdlib> //include library with system("cls") function
#include <conio.h> //include library with getch() function
#include <iomanip> //include library with setw() function
#include <tgmath.h> //include library with sin() & cos() functions
#include <math.h> //include M_PI
 
using namespace std;
 
double mySin(double xrad)
{
    double msin, del, x1, eps;
    int n;
    msin = xrad; //inital appropriation (початкове присвоєння)
    del = msin;
    n = 1;
    while (fabs(del)>=eps)
    {
        del = del*(-1*(xrad*xrad))/((n+1)*(n+2));
        msin = msin + del;
        n = n + 2;
    }
    return msin;
}
 
double myCos(double xrad)
{
    double mcos, del, x1, eps;
    int n;
    mcos = xrad; //inital appropriation (початкове присвоєння)
    del = mcos;
    n = 1;
    while (fabs(del)>=eps)
    {
        del = del*(-1*(xrad*xrad))/(2*n*(2*n-1));
        mcos = mcos + del;
        n = n + 2;
    }
    return mcos;
}
 
int main()
{
    char que;
    int m = 0; //variable responsible for user input
    bool menu = true; //variable continuation of the menu
    double x, x1, x2, eps, dx, xrad, del, msin, mcos, dif;
 
    do
        {
            cin.clear(); // resets all bits of stream
            cin.sync(); //remove data from the buffer
            system("cls");
 
            cout << "\nWelcome to Taylor v1.0\n\n"; //greeting
 
            cout << "\nEnter lower limit of the range from -1000 to 1000: ";
            while(!(cin>>x1) || (x1<-1000) || (x1>1000) || cin.get() != '\n' ) //incorrect input protection
                {
                    cout<<"Input incorrect. Please, try again.\n";
                    cin.clear(); // resets all bits of stream
                    cin.sync(); //remove data from the buffer
                    cout << "\nEnter lower limit of the range from -1000 to 1000: ";
                }
 
            cout << "\nEnter upper limit of the range from -1000 to 1000 (more than " << x1 <<"): ";
            while(!(cin>>x2) || (x2<-1000) || (x2>1000) || (x2<=x1) || cin.get() != '\n' ) //incorrect input protection
                {
                    cout<<"Input incorrect. Please, try again.\n";
                    cin.clear(); // resets all bits of stream
                    cin.sync(); //remove data from the buffer
                    cout << "\nEnter upper limit of the range from -1000 to 1000 (more than " << x1 <<"): ";
                }
 
            cout << "\nEnter step change of the argument (less than " << (x2-x1) << "): ";
            while(!(cin>>dx) || (dx>=(x2-x1)) || cin.get() != '\n' ) //incorrect input protection
                {
                    cout<<"Input incorrect. Please, try again.\n";
                    cin.clear(); // resets all bits of stream
                    cin.sync(); //remove data from the buffer
                    cout << "\nEnter step change of the argument (less than " << (x2-x1) << "): ";
                }
 
            cout << "\nEnter precision from 1e-15 to 1: ";
            while(!(cin>>eps) || (eps<(1e-15)) || (eps>=1) || cin.get() != '\n' ) //incorrect input protection
                {
                    cout<<"Input incorrect. Please, try again.\n";
                    cin.clear(); // resets all bits of stream
                    cin.sync(); //remove data from the buffer
                    cout << "\nEnter precision from 1e-15 to 1): ";
                }
 
            eps = fabs(eps);
            dx = fabs(dx);
 
            while(menu)
            {
                cout << "\n\nEnter number of desirable operation: ";
                cout << "\n1-Calculate sin(x)\n2-Calculate cos(x)\n0-Finish operations\n"; //output MAIN MENU
 
                if(!(cin>>m) || (m<0) || (m>2) || cin.get() != '\n' ) //incorrect input protection
                {
                    cout<<"Input incorrect. Try again\n";
                    cin.clear(); // resets all bits of stream
                    cin.sync(); //remove data from the buffer
                    cout << "\n\nEnter number of desirable operation: ";
                    cout << "\n\n1-Calculate sin(x)\n2-Calculate cos(x)\n0-Finish operations\n"; //output MAIN
                }
 
                else
                {
                    switch(m) //functions for each key pressed
                    {
                        case 1:
                        {
                            cout << "\nx\t" << "sin(x) Taylor    sin(x)    Difference\n\n";
 
                            x=x1;
                            while (x<=x2)
                            {
                                xrad = (x*M_PI)/180.; //180. ~ 180.0 number is real not integer
                                dif = fabs(sin(xrad)-mySin(xrad));
                                cout << x << setw(15) << mySin(xrad) << setw(15) << sin(xrad) << setw(15) << dif << endl;
                                x=x+dx;
                            }
                        }
                        break;
 
                        case 2:
                        {
                            cout << "\nx\t" << "sin(x) Taylor    sin(x)    Difference\n\n";
                            x=x1;
                            while (x<=x2)
                            {
                                xrad = (x*M_PI)/180.; //180. ~ 180.0 number is real not integer
                                dif = fabs(cos(xrad)-myCos(xrad));
                                cout << x << setw(15) << myCos(xrad) << setw(15) << cos(xrad) << setw(15) << dif << endl;
                                x=x+dx;
                            }
                        }
                        break;
 
                        case 0: //case of end
                        menu = false;
                    }
                }
            }
            cin.clear(); // resets all bits of stream
            cin.sync(); //remove data from the buffer
            cout << "\n\nRepeat with new values ?\n"; //request for repeating
            cout << " yes - press any key\n no  - press ESC\n"; //possible answers
            que = getch();
        }
        while (que!=27); // 27 is ACII code of ESC
 
        cout << "\nThank you for using our product. Bye!\n";
        getch();
 
 
    return 0;
}
tegauss
30 / 24 / 24
Регистрация: 06.05.2014
Сообщений: 158
16.05.2014, 00:22     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #6
Donville, а что Вы хотите? Чем Вас не устраивает стандартная функция, считающая синус? У Вас тут, судя по всему, используется разложение в ряд Маклорена, а это значит, что сходимость нормальная только возле нуля..
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.05.2014, 00:23     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #7
Donville, не хочется третий раз писать одно и то же. Но переменная eps должна быть проинициализирована, т.е. ей должно быть присвоено значение до того как с ней что-то сравнивать.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 00:37  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #8
tegauss, задание стоит так, что нужно сравнить их (посчитать разницу между результатами вычислений этими методами).
Tulosba,
C++
1
2
double x, x1, x2, dx, xrad, del, msin, mcos, dif;
    double eps = 0;
Сделал. Проблема не исчезает при этом. nan остаётся.
tegauss
30 / 24 / 24
Регистрация: 06.05.2014
Сообщений: 158
16.05.2014, 00:41     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #9
Donville, ох...

Поставьте eps = 0.00001
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 00:44  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #10
Я думаю, что нужно просто обрезать в конце числа до нескольких знаков после запятой.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.05.2014, 00:47     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #11
Donville, модуль числа никогда не будет меньше нуля. Вас этому в школе не учили?
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 00:59  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #12
Tulosba, еще нет.

Добавлено через 8 минут
Прописал в функции так:
C++
1
msin= round(msin * 10000000.0) / 10000000.0;
Ничего не виснет, но и разница между методами стала подозрительно маленькой (~1e-7).
voral
16.05.2014, 01:07
  #13

Не по теме:


Цитата Сообщение от Tulosba Посмотреть сообщение
Donville, модуль числа никогда не будет меньше нуля. Вас этому в школе не учили?
Цитата Сообщение от Donville Посмотреть сообщение
Tulosba, еще нет.
Я в шоке..... Т.е. на информатике уже такими задачами загружают, а на математики еще про модуль ни чего не сказали......
Толи я школу совсем забыл, толи .....

Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.05.2014, 01:12  [ТС]     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #14
Если не оговорено обратное, размещенный выше текст может содержать (с)Tulosba
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.05.2014, 07:14     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #15
Donville, с Вашей стороны это неуместно. Вам задачу решать надо, а не шутки шутить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 08:39     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan
Еще ссылки по теме:

Openssl. Иногда вызов функций шифрования проходит нормально, иногда нет C++
Почему иногда отслеживается нажатие на три клавиши сразу, а иногда нет C++
При возведении числа в степень оно становится равным Nan C++

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

Или воспользуйтесь поиском по форуму:
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,694
16.05.2014, 08:39     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan #16
Не совсем по вопросу.
Интересно.... А вы пробовали не правильное значение в "меню" выбрать... Что то мне подсказывает там лишние строки будут. Попробуйте применить do ... while вместо того if.
Yandex
Объявления
16.05.2014, 08:39     Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan
Ответ Создать тему
Опции темы

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