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

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

Восстановить пароль Регистрация
 
c++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 03:13     Выводит неточный результат #1
Где-то есть ошибка. Выводит неточный результат. Ввожу : 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2010, 03:13     Выводит неточный результат
Посмотрите здесь:

Указатели. Не выводит результат! C++
Не выводит результат C++
не выводит результат C++ C++
Не выводит результат C++
C++ C++ не выводит результат
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 12:09     Выводит неточный результат #2
c++\noob, Все правильно выводит Ваша программа.
Вот если ввести: 1 0.0001, тогда выдаст тоже правильный результат: 2.71825
c++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 13:59  [ТС]     Выводит неточный результат #3
ну тогда извините, недосмотрел =)

Добавлено через 14 минут
нет именно при вводе 1 0.001 должно быть 2.71825. Отправлял задачу на econtest - не приняли((
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 14:03     Выводит неточный результат #4
Условие задачи напишите.
c++\noob
 Аватар для 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++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2010, 14:22     Выводит неточный результат #6
Цитата Сообщение от c++\noob Посмотреть сообщение
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше Eps, все последующие слагаемые можно уже не учитывать
Вот ключевая фраза. Если очередное слагаемое по модулю меньше Eps (его нужно складывать с b),
а вот все последующие слагаемые можно уже не учитывать.
c++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 14:36  [ТС]     Выводит неточный результат #7
напишите ,пожалуйста, как надо
kazak
 Аватар для kazak
3029 / 2350 / 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
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 15:24  [ТС]     Выводит неточный результат #9
Переписал через do{}while - результат всё равно тот же. =(
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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
 Аватар для 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++
 Аватар для valeriikozlov
4660 / 2486 / 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
 Аватар для 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++
 Аватар для valeriikozlov
4660 / 2486 / 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++
 Аватар для valeriikozlov
4660 / 2486 / 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++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
22.12.2010, 10:42  [ТС]     Выводит неточный результат #18
valeriikozlov, спасибоо вам огромное всё заработало!!!
Yandex
Объявления
22.12.2010, 10:42     Выводит неточный результат
Ответ Создать тему
Опции темы

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