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

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

Войти
Регистрация
Восстановить пароль
 
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27
#1

Деление чисел. Ошибка на ровном месте. Не пойму почему. - C++

28.10.2009, 16:21. Просмотров 653. Ответов 6
Метки нет (Все метки)

Пишу задачу, где нужно вычислить простое выражение. И возникает проблема при делении 1 на другие числа. Код ниже:
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
//вычисление формулы
#include <iostream>
#include <iomanip>
#include <cmath>
#include <conio.h>
 
using namespace std;
 
int main()
{
    int n, t;//данные вводятся пользователем
    double M = 0;
    double x = 0;
    double Pr = 0;
    double y1 = 0;//промежуточные значения  (каждой части своя переменная)
    double y2 = 0;//промежуточные значения  (каждой части своя переменная)
    double y3 = 0;//промежуточные значения  (каждой части своя переменная)
    double y4 = 0;//промежуточные значения  (каждой части своя переменная)
    
    cout << "Enter n and t\n";
    cin >> n >> t;
    cout << "n = " << n << ", t = " << t << endl;
    if (n == 0)
    {
        cout << "n = 0. n can't be = 0\n";
    }
    else
    {
        M = (2*n - t)/2;            
        if(M == 0)
        {
            cout << "M = 0. Can't divide on 0.\n";
        }
        else
        {
            x = t/sqrt(M);
            cout << "REsult. M = " << M << ", x = " << x << endl;
            y1 = sqrt(n/M);
            y2 = 1 - (pow(x, 4) - 12*pow(x, 2) + 12)/96*M;
            cout << "n = " << n << endl;
            y3 = 1 + 1/(8*n) + 1/(128*n*n); 
            y4 = exp(-pow(x, 2)/4);
            cout << "y1 = " << y1 << 
                ", y2 = " << y2 << 
                ", y3 = " << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision (13) << y3 << 
                ", y4 = " << y4 << endl;
 
            Pr = y1*y2*y3*y4;
            cout << "Pr = " << setiosflags(ios::fixed)
                << setiosflags(ios::showpoint)
                << setprecision (13) << Pr << endl;
        }
    }
    return 0;
}
Проблема возникает вот с этим выражением y3 = 1 + 1/(8*n) + 1/(128*n*n);
Например, для данных n = 5; t = 8.
Если это выражение посчитать на калькуляторе y3 = 1 + 1/(8*5) + 1/(128*5*5) то получается y3 = 1,0253125 А в программе получается y3 = 1. То есть она отбрасывает дробную часть. Может кто-нибудь объяснить, почему так? Везде тип данных double.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2009, 16:21     Деление чисел. Ошибка на ровном месте. Не пойму почему.
Посмотрите здесь:

Не создаётся объект string на ровном месте! Почему? - C++
Ребята, чё-то я не пойму: #include &lt;string&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main () { char...

считываю текстовый файл в строку, программа вылетает на ровном месте, почему? - C++
Друзья! Вот код #include &lt;windows.h&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; #include...

Ошибки на ровном месте (VS2010) - C++
В общем, сделал класс разбитый на два файла (.h и .cpp). Часть методов этого класса определена прямо в его теле при его объявлении (т.е. в...

"error: expected unqualified-id at end of input" на ровном месте - C++
Собственно вот код - ничего сложного, пример элементарной вложенной косвенности: #include &lt;iostream&gt; using namespace std; int...

Не пойму, почему не работает - C++
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; ...

Не пойму почему не компилирует - C++
Начал читать &quot;Как програмировать на С++&quot; Дейтелов Дошёл до главы &quot;Введение в классы и объекты&quot;, Отделение интерфейса от реализации,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
28.10.2009, 16:29     Деление чисел. Ошибка на ровном месте. Не пойму почему. #2
int n, t;//данные вводятся пользователем

теряешь здесь M = (2*n - t)/2;
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
28.10.2009, 16:31     Деление чисел. Ошибка на ровном месте. Не пойму почему. #3
Попробуй так:
C++
1
y3 = 1 + 1/(8*(double)n) + 1/(128*(double)n*(double)n);
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
28.10.2009, 16:32     Деление чисел. Ошибка на ровном месте. Не пойму почему. #4
почувствуй разницу. кусок твоего кода, скомпили для n=5 t=7

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
//вычисление формулы
#include <iostream>
#include <iomanip>
#include <cmath>
#include <conio.h>
 
using namespace std;
 
int main()
{
    int n, t;//данные вводятся пользователем
    double M = 0;
    double x = 0;
    double Pr = 0;
    double y1 = 0;//промежуточные значения  (каждой части своя переменная)
    double y2 = 0;//промежуточные значения  (каждой части своя переменная)
    double y3 = 0;//промежуточные значения  (каждой части своя переменная)
    double y4 = 0;//промежуточные значения  (каждой части своя переменная)
 
    cout << "Enter n and t\n";
    cin >> n >> t;
    cout << "n = " << n << ", t = " << t << endl;
    if (n == 0)
    {
        cout << "n = 0. n can't be = 0\n";
    }
    else
    {
        M = (2*n - t)/2;                        
        cout<<"M:  "<<M<<endl;
        M = (double)(2*n - t)/2;           // !!!!!!! тут    (double)            
        cout<<"M:  "<<M<<endl;
    }
    system("PAUSE");
    return 0;
}
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27
28.10.2009, 16:36  [ТС]     Деление чисел. Ошибка на ровном месте. Не пойму почему. #5
Спасибо большое! Именно в этом проблема.
Совет valeriikozlov работает. Хотя, чтобы не усложнять формулу, сразу сделаю n и t double.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
28.10.2009, 16:38     Деление чисел. Ошибка на ровном месте. Не пойму почему. #6
Цитата Сообщение от Biblio Посмотреть сообщение
Хотя, чтобы не усложнять формулу, сразу сделаю n и t double.
Правильное решение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2009, 16:48     Деление чисел. Ошибка на ровном месте. Не пойму почему.
Еще ссылки по теме:

Вылетает программа. Не пойму, почему? - C++
Здравствуйте. Написал прогу на С++ - это лаба по ООП. Но она вылетает. Не пойму почему! // объявление класса Date #include &lt;iostream&gt; ...

не пойму почему не идет программа - C++
Дана последовательность из n целых чисел. Определить, все ли числа являются нулевыми или первое ненулевое число является положительным. ...

Не пойму почему перменная d изменяет значения - C++
// Kursovay_2.cpp: определяет точку входа для консольного приложения. //После выхода из функции graf_null изменяется перменная d ...

Не пойму почему функция не переворачивает строку! - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void reversit(char word); int main() { const int MAX=80; int...


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

Или воспользуйтесь поиском по форуму:
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27
28.10.2009, 16:48  [ТС]     Деление чисел. Ошибка на ровном месте. Не пойму почему. #7
Цитата Сообщение от TanT Посмотреть сообщение
почувствуй разницу. кусок твоего кода, скомпили для n=5 t=7
C++
1
2
3
4
5
6
7
8
/
{
        M = (2*n - t)/2;                        
        cout<<"M:  "<<M<<endl;
        M = (double)(2*n - t)/2;           // !!!!!!! тут    (double)            
        cout<<"M:  "<<M<<endl;
    }
}
А вот слона то я и не заметила! Спасибо большое. Эту ошибку я сначала совсем не увидела.
Сделала все переменные типа double, чтобы избежать новых проблем.
Вроде сейчас все нормально.
Yandex
Объявления
28.10.2009, 16:48     Деление чисел. Ошибка на ровном месте. Не пойму почему.
Ответ Создать тему
Опции темы

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