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

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

Войти
Регистрация
Восстановить пароль
 
 
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
#1

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

15.05.2014, 23:48. Просмотров 473. Ответов 15
Метки нет (Все метки)

Доброго времени суток! Помогите, пожалуйста, оптимизировать код. Дело в том, что компьютер при исчислениях ненадолго виснет и иногда выбивает число 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2014, 23:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan (C++):

max [NaN, число] vs max [число, NaN] - C++
объясните пожалуйста, в чем прикол? double a = numeric_limits&lt;double&gt;::quiet_NaN(); double b = 1.0; double c = max(b, a); // с =...

Даны натуральное число n, действительные числа a1,...,an. Получить: max (-a1,a2,-a3,...,(-1)nan) - C++
Даны натуральное число n, действительные числа a1,...,an. Получить: max (-a1,a2,-a3,...,(-1)nan);

Компьютер иногда не видит жесткий диск, не загружает ОС или просто виснет с синим экраном. - Компьютерное железо
Кратко суть проблемы: Начал у меня на днях комп глючить: то одного из двух дисков (оба - PATA) не увидит, то ХРюшку загрузит не с первого...

Выбивает компьютер при включении флешки - Flash-память
Помогите разобраться! Через раз, при прикосании флешкой к USB разъемом на лицевой панели и картридере выбивает комп. Точно такое же...

Компьютер зависает, иногда с полоской по монитору, иногда с синим экраном. - Компьютерное железо
У меня такая штука с компом: включаешь компьютер, можешь подолгу за ним сидеть: играть, смотреть фильм, ну и тому подобное(что угодно)......

Компьютер сам отключается. Иногда моментально, иногда через время - Компьютерное железо
Привет всем. В общем комп при включении издает какой то треск и сразу отключается. Иногда бывает работает некоторое время и все равно...

15
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.05.2014, 23:52 #2
Цитата Сообщение от Donville Посмотреть сообщение
Может ли быть проблема в слишком точном M_PI?
Как минимум проблема в том, что eps не инициализировано.
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
16.05.2014, 00:11  [ТС] #3
Это лишь часть кода

Добавлено через 14 минут
Подскажите, что делать, пожалуйста.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.05.2014, 00:12 #4
Цитата Сообщение от Donville Посмотреть сообщение
Это лишь часть кода
Т.е. eps на самом деле инициализировано?
Цитата Сообщение от Donville Посмотреть сообщение
Подскажите, что делать, пожалуйста.
Приводить весь код так как он есть.
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
16.05.2014, 00:15  [ТС] #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;
}
0
tegauss
30 / 24 / 24
Регистрация: 06.05.2014
Сообщений: 158
16.05.2014, 00:22 #6
Donville, а что Вы хотите? Чем Вас не устраивает стандартная функция, считающая синус? У Вас тут, судя по всему, используется разложение в ряд Маклорена, а это значит, что сходимость нормальная только возле нуля..
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.05.2014, 00:23 #7
Donville, не хочется третий раз писать одно и то же. Но переменная eps должна быть проинициализирована, т.е. ей должно быть присвоено значение до того как с ней что-то сравнивать.
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
16.05.2014, 00:37  [ТС] #8
tegauss, задание стоит так, что нужно сравнить их (посчитать разницу между результатами вычислений этими методами).
Tulosba,
C++
1
2
double x, x1, x2, dx, xrad, del, msin, mcos, dif;
    double eps = 0;
Сделал. Проблема не исчезает при этом. nan остаётся.
0
tegauss
30 / 24 / 24
Регистрация: 06.05.2014
Сообщений: 158
16.05.2014, 00:41 #9
Donville, ох...

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

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

Не по теме:


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

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

Компьютер зависает: иногда намертво, иногда просто тормозит. - Материнские платы
компьютер время от времени зависает, намертво виснит на несколько секунд мышь и клавиатура, затем отвисает. Иногда виснет по другому:...

Компьютер иногда выключается при включении - Компьютерное железо
у меня комп при его включении имеет такое свойство сам выключаться, что это и как устранить???

Компьютер самостоятельно перезагружается при запуске некоторых игр и иногда Firefox - BSOD
Здравствуйте! Меня переправили в этот форум отсюда - http://www.cyberforum.ru/viruses/thread1422905.html#post7498825 , поскольку...

Компьютер иногда зависает при выходе из ScreenServer'а, часто в играх с 3D окружением. - Компьютерное железо
Всем привет. Помогите!!! Я не совсем понимаю, в чем проблема, но могу только догадываться. Мне очень хотелось бы узнать мнение...


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

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

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