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

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

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

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

20.12.2010, 03:13. Просмотров 770. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2010, 03:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выводит неточный результат (C++):

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

Не выводит результат - C++
Не понимаю почему, но нет вывода результата работы программы. #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int...

Не выводит результат - C++
Здравствуйте! Начал изучать данный язык программирования, написал следующую коротенькую программу: #include &lt;iostream.h&gt; #include...

Не выводит результат - C++
Ни как не могу вывести результат. #include &lt;stdio.h&gt; #include &lt;math.h&gt; int F(int x) { return atan (x)+pow(log( x*x ),2); ...

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

Не выводит результат - C++
На 3 пункте меню, после решения программа выводит матрицу из нулей. Не могу разобраться, помогите пожалуйста) #include &quot;stdafx.h&quot; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
valeriikozlov
Эксперт C++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
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++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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).
А ссылку на задачу можете написать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2010, 07:28
Привет! Вот еще темы с ответами:

Программа не выводит результат - C++
Всем привет! У меня есть программа, написанная мною, на 90% готовая, однако, в ней то ли чего-то не хватает, то ли ошибка какая-то, которая...

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

Программа не выводит результат - C++
Используя рекурсивные функции, решите следующие задачи: Подсчитать количество цифр в заданном числе. #include &lt;iostream&gt; ...

Программа не выводит результат...??? - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;sstream&gt; using namespace std; class stroki { private: string str; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.12.2010, 07:28
Ответ Создать тему
Опции темы

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