Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2012, 09:19   #1
konstantusha
 
Регистрация: 30.09.2012
Сообщений: 8
По умолчанию Программа неточно вычисляет произведение

Здравствуйте! Возникла проблема с такой задачей: нужно подсчитывать произведение а[k]-тых пока а[k]-а[k-1]>eps. а[k]=а[k-1]+а[k-1]/2^(k-1), k=2,3.... a[0]=a[1]=1. Написанная мною программа работает, но начиная с произведения a[1]*..*a[4] подсчитывает с неточностью, которая в последующем увеличивается. Подскажите пожалуйста, в чем причина и как это исправить?

Код:
# include <math.h>
# include <iostream>
using namespace std;
float a,a1,b,eps,p;
int k;
void main()
{
    setlocale(LC_ALL,"Russian");
    cout<<"Введите eps ";
    cin>>eps;
    p=1;
    a=1;
    k=2;
    do
    {
        a1=a+a/pow((float)2,k-1);
        b=a;
        a=a1;
        if(fabs(a1-b)>eps)
        {
            p=p*a1;
        }
        k=k+1;
    }
    while(fabs(a1-b)>eps);
    
    cout<<p<<endl;
    system("pause");
}
konstantusha вне форума Ответить с цитированием
Старый 10.10.2012, 10:34   #2
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Что именно неточно? Опишите поподробнее, пожалуйста. Как вы определили эту неточность?
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 10.10.2012, 11:27   #3
konstantusha
 
Регистрация: 30.09.2012
Сообщений: 8
По умолчанию

Проверяла на калькуляторе.
получаемый результат - ожидаемый результат
1,50 - 1,50
2,8125 - 2,8125
5,93262 - 5,90625
13,2962 - 13,1709375
30,7309 - 30,28904033
72,1366 - 70,74369193
170,654 - 166,5212525
405,293 - 393,5000344

Последний раз редактировалось konstantusha; 10.10.2012 в 11:31.
konstantusha вне форума Ответить с цитированием
Старый 10.10.2012, 11:55   #4
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Цитата:
Сообщение от konstantusha Посмотреть сообщение
Проверяла на калькуляторе.
получаемый результат - ожидаемый результат
1,50 - 1,50
2,8125 - 2,8125
5,93262 - 5,90625
13,2962 - 13,1709375
30,7309 - 30,28904033
72,1366 - 70,74369193
170,654 - 166,5212525
405,293 - 393,5000344
Ничего подобного. Ввожу эти результаты в программу с данным кодом. Выдает другое. Обычно - "1".



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

Тьфу! Все, понял. Напишите значения, которые вы вводите. Вот!

Попробуйте вместо типа float(одинарная точность) - double(двойную точность).
Никто

мой блог

Последний раз редактировалось three_cats; 10.10.2012 в 12:00.
three_cats вне форума Ответить с цитированием
Старый 10.10.2012, 12:02   #5
konstantusha
 
Регистрация: 30.09.2012
Сообщений: 8
По умолчанию

Правильно. Программа выдает произведение равное 1, потому что вы вводили такое eps, которое заранее больше первого a[k].

Если вы, к примеру, введете eps=0.01, программа выдаст результат 170,654, что является неточным результатом...
konstantusha вне форума Ответить с цитированием
Старый 10.10.2012, 12:03   #6
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

А еще я не могу понять, объясните, вот это условие зачем?
Код:
        if(fabs(a1-b)>eps)
        {
            p=p*a1;
        }
И какая функция на калькуляторе это делает? Хочу тоже проверить...
Никто

мой блог

Последний раз редактировалось three_cats; 10.10.2012 в 12:10.
three_cats вне форума Ответить с цитированием
Старый 10.10.2012, 12:11   #7
konstantusha
 
Регистрация: 30.09.2012
Сообщений: 8
По умолчанию

Если его убрать, то программа начнет выдавать произведение, в котором будет участвовать на один член больше, чем мне нужно..
Я прикрепила документ, в нем некоторые просчитанные a[k], значения eps и соответствующие результаты программы.
Заменить float на double было первое, что я сделала, когда увидела неточность.Увы, не помогло.
Вложения
Тип файла: doc Документ Microsoft Office Word.doc (23.0 Кб, 10 просмотров)

Последний раз редактировалось konstantusha; 10.10.2012 в 12:31.
konstantusha вне форума Ответить с цитированием
Старый 10.10.2012, 13:20   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Сейчас посчитал на калькуляторе Ак-е члены, по-моему, вы их неправильно посчитали на калькуляторе.
Цитата:
1
1
1.5
1.875
2.1093
2.2412
Немножко переписал вашу программу:
Код:
#include <math.h>
#include <iostream>
using namespace std;
double a1, a2, eps, p, t;
int k;
 
int
main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите eps ";
    cin >> eps;
    p = 1;
    a1 = 1;
    a2 = 1;
    t = 2;
    k = 2;
    while (a1 / t > eps) {
        a1 = a2;
        a2 *= (1 + 1 / t); 
        p = p * a2;
        cout << k << ") " << p << endl;
        ++k;
        t *= 2;
    }
    
    cout << p << endl;
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.10.2012 в 13:22.
BDA вне форума Ответить с цитированием
Старый 10.10.2012, 15:17   #9
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Радость

Друзья! Решил задачу своим способом, но, судя по всему, неправильно. Объясните, где ошибка! Никак не могу допереть, весь мозг себе уже вынес!

Код:
#include <iostream>
#include <conio.h>
#include <locale>
#include <stdio.h>
#include <math.h>

using namespace std;

void get_n_run(double eps) {

double a[10];

a[0] = a[1] = 1;

int k = 2;
double sum = 0;
double pr = 1;

do {
   a[k] = a[k-1] / pow(2,k-1);
   sum = sum + a[k];
   pr = pr * sum;
   k++;
} while ( fabs(a[k] - a[k-1]) > eps);

    cout << "Результат: " << pr << endl;

}

int main() {

setlocale(LC_ALL, "Russian");

cout << "Введите значение eps: ";
double eps;
cin >> eps;
get_n_run(eps);

cout << "Нажмите любую клавишу...";
getch();
return 0;
}
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 10.10.2012, 15:30   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

three_cats
Сразу бросается в глаза:
a[k] = a[k-1] / pow(2,k-1); не верна
правильная формула:
a[k] = a[k-1] + a[k-1] / pow(2,k-1);
или
a[k] = a[k-1] * (1 + 1 / pow(2,k-1));
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(( А у меня логарифм не вычисляет. Программа выдает простые числа. trumbubudunchik C# (си шарп) 1 24.05.2012 16:22
Программа которая вычисляет принадлежит ли ли данная точка «заштрихованной» области. Kesida Помощь студентам 3 05.10.2011 03:48
программу, которая вычисляет произведение двух заданных пользователем чисел smile) Помощь студентам 1 15.09.2010 19:19
программа с использованием подпрограмм, создаёт односвязный список и вычисляет сумму положительных чисел LOVELY Паскаль, Turbo Pascal, PascalABC.NET 5 13.12.2008 01:27
Надо чтобы программа выводила i начиная с 1 значения.Оно у мну дальше 1 и не вычисляет..? Влад-mego Помощь студентам 3 27.11.2008 23:10