Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52
1

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

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

Author24 — интернет-сервис помощи студентам
Где-то есть ошибка. Выводит неточный результат. Ввожу : 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2010, 03:13
Ответы с готовыми решениями:

Не выводит результат
Не понимаю почему, но нет вывода результата работы программы. #include &lt;cstdlib&gt; #include...

C++ не выводит результат
W7 ,64bit Borland C++ Builder Enterprise v6.0(10.161),я начинающий Копирую рабочую...

Не выводит результат
Здравствуйте! Начал изучать данный язык программирования, написал следующую коротенькую программу:...

Не выводит результат
На 3 пункте меню, после решения программа выводит матрицу из нулей. Не могу разобраться, помогите...

17
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.12.2010, 12:09 2
c++\noob, Все правильно выводит Ваша программа.
Вот если ввести: 1 0.0001, тогда выдаст тоже правильный результат: 2.71825
1
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 13:59  [ТС] 3
ну тогда извините, недосмотрел =)

Добавлено через 14 минут
нет именно при вводе 1 0.001 должно быть 2.71825. Отправлял задачу на econtest - не приняли((
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.12.2010, 14:03 4
Условие задачи напишите.
1
-2 / 2 / 1
Регистрация: 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, все последующие слагаемые можно уже не учитывать
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.12.2010, 14:22 6
Цитата Сообщение от c++\noob Посмотреть сообщение
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше Eps, все последующие слагаемые можно уже не учитывать
Вот ключевая фраза. Если очередное слагаемое по модулю меньше Eps (его нужно складывать с b),
а вот все последующие слагаемые можно уже не учитывать.
1
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 14:36  [ТС] 7
напишите ,пожалуйста, как надо
0
3565 / 2712 / 347
Регистрация: 11.03.2009
Сообщений: 6,246
20.12.2010, 14:49 8
Цитата Сообщение от c++\noob Посмотреть сообщение
for(p=1; pow(x,p)/factorial(p)>eps; p++)
Тут лучше делать с do{}while
0
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52
20.12.2010, 15:24  [ТС] 9
Переписал через do{}while - результат всё равно тот же. =(
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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;
}
1
-2 / 2 / 1
Регистрация: 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;
}
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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;
}
1
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
20.12.2010, 20:07 13
Double тоже надолго не хватит. Правильное решение таких задач - не вычислять факториал отдельно вообще, и pow по условию задачи тоже нельзя использовать кстати, а вычислять следующий член через предыдущий по рекурентной формуле.

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

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

И никаких сусликов!
1
-2 / 2 / 1
Регистрация: 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 . ((( хз что сней делать
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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).
А ссылку на задачу можете написать?
0
481 / 119 / 17
Регистрация: 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;
  }
- тогда условие задачи будет выполняться, хотя это уже вынужденный хренокодинг.
1
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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;
}
1
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52
22.12.2010, 10:42  [ТС] 18
valeriikozlov, спасибоо вам огромное всё заработало!!!
0
22.12.2010, 10:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2010, 10:42
Помогаю со студенческими работами здесь

Не выводит результат
Ни как не могу вывести результат. #include &lt;stdio.h&gt; #include &lt;math.h&gt; int F(int x) {...

не выводит результат C++
int _tmain(int argc, _TCHAR* argv) { float x2, y2, z2, r, x1, y1, z1, s; if (x1&lt;0) else if...

Указатели. Не выводит результат!
С указателями у меня вообще труба. Задача: из массива положителтные элементы переписать в начало,...

Программа не выводит результат
Здравствуйте, MVS 2012 адекватно компилирует, но при тестировании не выводит результат Листинг:...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru