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

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

Войти
Регистрация
Восстановить пароль
 
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27
28.10.2009, 16:21     Деление чисел. Ошибка на ровном месте. Не пойму почему. #1
Пишу задачу, где нужно вычислить простое выражение. И возникает проблема при делении 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     Деление чисел. Ошибка на ровном месте. Не пойму почему.
Посмотрите здесь:

Не пойму почему функция не переворачивает строку! C++
не пойму почему не идет программа C++
Ошибки на ровном месте (VS2010) C++
"error: expected unqualified-id at end of input" на ровном месте C++
Не создаётся объект string на ровном месте! Почему? C++
C++ считываю текстовый файл в строку, программа вылетает на ровном месте, почему?
C++ Простая прога на использование конструкторов и деструкторов в с++ не работает ( не пойму почему (
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
28.10.2009, 16:29     Деление чисел. Ошибка на ровном месте. Не пойму почему. #2
int n, t;//данные вводятся пользователем

теряешь здесь M = (2*n - t)/2;
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 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
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 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++
 Аватар для valeriikozlov
4661 / 2487 / 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++ Не пойму почему не компилирует
C++ Не пойму почему перменная d изменяет значения
C++ В общем, не пойму почему криво заполняется массив
Не пойму, почему не работает C++
Вылетает программа. Не пойму, почему? C++

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

Или воспользуйтесь поиском по форуму:
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     Деление чисел. Ошибка на ровном месте. Не пойму почему.
Ответ Создать тему
Опции темы

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