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

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

Войти
Регистрация
Восстановить пароль
 
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
#1

Выводит неточный результат - C++

20.12.2010, 03:13. Просмотров 760. Ответов 17
Метки нет (Все метки)

Где-то есть ошибка. Выводит неточный результат. Ввожу : 1 0.001 Выводит: 2.71806 , а надо 2.71825

Исправьте пожалуйста.

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
#include <stdio.h>
#include <math.h>
int factorial(int a)// funcion factorial
{
int g=1;
for(int i=1; i<=a; i++)
{
g=g*i;
}
return(g);
}
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0;
 
int p;
for(p=1; pow(x,p)/factorial(p)>eps; p++)
{
b=b+pow(x,p)/factorial(p);
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", b);
fclose(f);
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 12:09     Выводит неточный результат #2
c++\noob, Все правильно выводит Ваша программа.
Вот если ввести: 1 0.0001, тогда выдаст тоже правильный результат: 2.71825
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 13:59  [ТС]     Выводит неточный результат #3
ну тогда извините, недосмотрел =)

Добавлено через 14 минут
нет именно при вводе 1 0.001 должно быть 2.71825. Отправлял задачу на econtest - не приняли((
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 14:03     Выводит неточный результат #4
Условие задачи напишите.
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 14:10  [ТС]     Выводит неточный результат #5
valeriikozlov, нет именно при вводе 1 0.001 должно быть 2.71825. Отправлял задачу на econtest - не приняли((

Добавлено через 22 секунды
щас секунду

Добавлено через 33 секунды
извините за второе сообщение нечаянно отправил)

Добавлено через 3 минуты
Не используя стандартные функции (за исключением ABS), вычислить с точностью Eps:

y=e^x=1 + x/1! + x^2/2! + ... + x^n/n! + ...

Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше Eps, все последующие слагаемые можно уже не учитывать
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 14:22     Выводит неточный результат #6
Цитата Сообщение от c++\noob Посмотреть сообщение
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше Eps, все последующие слагаемые можно уже не учитывать
Вот ключевая фраза. Если очередное слагаемое по модулю меньше Eps (его нужно складывать с b),
а вот все последующие слагаемые можно уже не учитывать.
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 14:36  [ТС]     Выводит неточный результат #7
напишите ,пожалуйста, как надо
kazak
3032 / 2353 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
20.12.2010, 14:49     Выводит неточный результат #8
Цитата Сообщение от c++\noob Посмотреть сообщение
for(p=1; pow(x,p)/factorial(p)>eps; p++)
Тут лучше делать с do{}while
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 15:24  [ТС]     Выводит неточный результат #9
Переписал через do{}while - результат всё равно тот же. =(
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 16:19     Выводит неточный результат #10
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
#include <stdio.h>
#include <math.h>
int factorial(int a)// funcion factorial
{
int g=1;
for(int i=1; i<=a; i++)
{
g=g*i;
}
return(g);
}
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0;
 
int p, fl=1;
for(p=1; fl==1; p++)
{
b=b+pow(x,p)/factorial(p);
if(pow(x,p)/factorial(p)<eps)
    fl=0;
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", b);
fclose(f);
return 0;
}
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 19:23  [ТС]     Выводит неточный результат #11
Извините пожалуйста. Я наверно вас уже достал, но опять где-то есть недочёт (econtest не принимает). Ввожу 3.14 0.000001, выбивает 22.19869, а надо 23.10387.

Добавлено через 6 минут
Цитата Сообщение от valeriikozlov Посмотреть сообщение
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
#include <stdio.h>
#include <math.h>
int factorial(int a)// funcion factorial
{
int g=1;
for(int i=1; i<=a; i++)
{
g=g*i;
}
return(g);
}
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0;
 
int p, fl=1;
for(p=1; fl==1; p++)
{
b=b+pow(x,p)/factorial(p);
if(pow(x,p)/factorial(p)<eps)
    fl=0;
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", b);
fclose(f);
return 0;
}
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 19:47     Выводит неточный результат #12
Для данного набора входных данных: 3.14 0.000001 типа int для вычисления факториала числа не хватает (функция factorial() возвращает отрицательное значение), пробуйте так:
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
#include <stdio.h>
#include <math.h>
double factorial(double a)// funcion factorial
{
double g=1;
for(int i=1; i<=a; i++)
{
g=g*i;
}
return(g);
}
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0;
 
double p;
int fl=1;
for(p=1; fl==1; p++)
{
b=b+pow(x,p)/factorial(p);
if(pow(x,p)/factorial(p)<eps)
        fl=0;
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", b);
fclose(f);
return 0;
}
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
20.12.2010, 20:07     Выводит неточный результат #13
Double тоже надолго не хватит. Правильное решение таких задач - не вычислять факториал отдельно вообще, и pow по условию задачи тоже нельзя использовать кстати, а вычислять следующий член через предыдущий по рекурентной формуле.

Добавлено через 5 минут
В данном случае рекурентное соотношение такое:

http://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{0}=1, http://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{i}={y}_{i-1}*x/i

И никаких сусликов!
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 21:22  [ТС]     Выводит неточный результат #14
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Для данного набора входных данных: 3.14 0.000001 типа int для вычисления факториала числа не хватает (функция factorial() возвращает отрицательное значение), пробуйте так:
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
#include <stdio.h>
#include <math.h>
double factorial(double a)// funcion factorial
{
double g=1;
for(int i=1; i<=a; i++)
{
g=g*i;
}
return(g);
}
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0;
 
double p;
int fl=1;
for(p=1; fl==1; p++)
{
b=b+pow(x,p)/factorial(p);
if(pow(x,p)/factorial(p)<eps)
        fl=0;
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", b);
fclose(f);
return 0;
}
econtest опять выдаёт ошибку. ввод 2 300 , вывод 3.00000, надо 1.00000 . ((( хз что сней делать
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2010, 07:28     Выводит неточный результат #15
c++\noob,

Цитата Сообщение от c++\noob Посмотреть сообщение
ввод 2 300 , вывод 3.00000, надо 1.00000
Вы не ошибаетесь?
x=2, eps=300
b=1+2/1=3, цикл останавливается после вычисления первого слагаемого 2/1 (т.к. оно меньше 300).
Кстати Вам хороший алгоритм написал Напильнег (но даже в этом случае его алгоритм выдаст тоже 3.00000).
А ссылку на задачу можете написать?
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
21.12.2010, 11:23     Выводит неточный результат #16
Цитата Сообщение от valeriikozlov Посмотреть сообщение
x=2, eps=300
b=1+2/1=3, цикл останавливается после вычисления первого слагаемого 2/1 (т.к. оно меньше 300).
Я так понимаю, что реализовать надо так, чтобы в этом случае выход был уже после первого слагаемого, строго следуя условию задачи, а не по принципу "кашу маслом не испортишь", хотя с точки зрения практических вычислений это бред.

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Кстати Вам хороший алгоритм написал Напильнег (но даже в этом случае его алгоритм выдаст тоже 3.00000).
Напильнег написал, как вычислять следующий член суммы, а скомпоновать можно по разному.

Например, так:
C++
1
2
3
4
5
6
7
  y=0; 
  i=0; yi=1;
  while (1) {
    y=y+yi; 
    if (yi<eps) break;
    i++; yi=yi*x/i;
  }
- тогда условие задачи будет выполняться, хотя это уже вынужденный хренокодинг.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2010, 11:46     Выводит неточный результат #17
Да я не учел что первое слагаемое 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
#include <stdio.h>
 
int main()
{
FILE *f;
double x,eps;
f = fopen("input.txt","r");
fscanf(f,"%lf %lf", &x, &eps);
fclose(f);
double b=1.0, y=0.0;
double p;
int fl=1;
for(p=1; fl==1; p++)
{
y=y+b;
if(b<eps)
    fl=0;
b=b*x/p;
}
 
f = fopen("output.txt","w");
fprintf(f, "%.5lf", y);
fclose(f);
return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 10:42     Выводит неточный результат
Еще ссылки по теме:

C++ Не выводит не правильный результат
C++ не правильно выводит результат
C++ Не выводит результат
C++ Программа не выводит результат
Не выводит результат C++

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

Или воспользуйтесь поиском по форуму:
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
22.12.2010, 10:42  [ТС]     Выводит неточный результат #18
valeriikozlov, спасибоо вам огромное всё заработало!!!
Yandex
Объявления
22.12.2010, 10:42     Выводит неточный результат
Ответ Создать тему
Опции темы

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