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

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

Войти
Регистрация
Восстановить пароль
 
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
#1

Увеличение точности при подсчетах - C++

01.03.2013, 16:56. Просмотров 1147. Ответов 9
Метки нет (Все метки)

Есть полностью рабочая программа, она находит корень К из числа Х с точностью prec.
Работает все хорошо, но при подсчетах с дробовыми числами идет потеря во втором-третем знаке.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>;
#include <conio.h>;
#include <math.h>;
 
main()
{clrscr();
 
float x,k,prec,y,yk,b,z;
int p;
 
printf("enter number \n");
scanf(" %f",&x);
printf("enter degree\n");
scanf(" %f",&k);
printf("enter accuracy \n");
scanf(" %f",&prec);
y=1;
p=k;
if (x==0)
{ printf("x=0");}
if ((x>0) && (k>0))
{
do
{
yk=y;
for (int i=k-1; i>1; i--) yk=y*yk;
 
b=(1/k)*((x/yk)-y);
if (fabs(b)>prec) y=y+b;
}
while (fabs(b)>prec);
 
printf("result:  %f \n",y); }
 
if ((x>0) && (k<0))
{k=abs(k);
do
{
yk=y;
for (int i=k-1; i>1; i--) yk=y*yk;
 
b=(1/k)*((x/yk)-y);
if (fabs(b)>prec) y=y+b;
}
while (fabs(b)>prec);
z=1/y;
printf("result:  %f \n",z); }
 
 
if ((x<0) && (k>0) && ((p%2)!=0))
{x=abs(x);
do
{
yk=y;
for (int i=k-1; i>1; i--) yk=y*yk;
 
b=(1/k)*((x/yk)-y);
if (fabs(b)>prec) y=y+b;
}
while (fabs(b)>prec);
z=y-2*y;
printf("result:  %f \n",z); }
 
 
 
if ((x<0) && (k<0) && ((p%2)!=0))
{x=abs(x);
k=abs(k);
do
{
yk=y;
for (int i=k-1; i>1; i--) yk=y*yk;
 
b=(1/k)*((x/yk)-y);
if (fabs(b)>prec) y=y+b;
}
while (fabs(b)>prec);
z=1/(y-2*y);
printf("result:  %f \n",z); }
 
if ((x<0) && ((p%2)==0))
{printf("inccorect, if x<0, degree must be unparne");}
 
if (k==0)
{printf("  degree cant be zero");}
 
 
 
getch();
return 0;
 
}
при числе 0.25, степени кореня 4.4 получается ответь аля 0.704111. Должно при этих значениях получатся 0.72974005.
Просьба помочь, ибо как тут выкрутится я не знаю. точностьи 1Е-5 обычно хватает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 16:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Увеличение точности при подсчетах (C++):

Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. - C++
Итак, здравствуйте. Такая проблема. Существует формула для нахождения 2-й производной функции: f''(x) = (f(x + h) - 2f(x) + f(x - h))...

Потеря точности при масштабировании - C++
Доброго времени суток может кто-то подскажет алгоритм масштабирования без потери точности,пока я для этого пользуюсь типом double и...

Потеря точности при использовании static_cast - C++
По условию задачи нужно было явное приведение к типу. float n=45.5; int temp=static_cast&lt;int&gt;(n); ...

Как посчитать значение при потери точности? - C++
Преобразования плавающих типов. Величины типа float преобразуются к типу double без изменения значения. Величины double и long double...

Написать программу, демонстрирующую потери точности при арифметических операциях - C++
Можете рассписать по пунктам, что делать? Суть задания я уловила, а как реализовать - без единого понятия! Потеря точности при сложении:...

Табулировать функции F и S при заданной точности E, с указанным шагом и диапазоном значений по x: - C++
Помогите пожалуйста написать программу: Табулировать функции F и S при заданной точности E, с указанным шагом и диапазоном значений по x:

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:16 #2
Цитата Сообщение от Baium Посмотреть сообщение
дробовыми числами
С дробовыми числами вообще ухо востро держать нужно

Добавлено через 5 минут
float замени на double или long double
0
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
01.03.2013, 17:22  [ТС] #3
Цитата Сообщение от ITcrusader Посмотреть сообщение
С дробовыми числами вообще ухо востро держать нужно

Добавлено через 5 минут
float замени на double или long double
при double в scanf("%f") f на что нужно заменить?
если на "е" то возникает другого рода непонятная проблема - число икс равное 0.25 программа воспринимает за число, которое меньше нуля...
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:33 #4
Baium, пробуй "%le" или "%lf". Я не помню)))
0
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
01.03.2013, 17:36  [ТС] #5
при doyble все равно выдает 7.071110е-1 т.е. тоже значнеие но в другом виде...
при лонг флоате 0.707111 все те же...
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:40 #6
Напиши, какие числа мне скормить твоей программулине, чтобы получить такой результат?
0
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
01.03.2013, 17:42  [ТС] #7
первое число, с окторого мы будет брать корень - 0.25
сам корень 4.4
ну а точность 1Е-5
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:49 #8
Тогда, могу сделать 2 предположения:
1. Ты гонишься не за тем числом.
2. Ошибка в логике программы.

Поскольку увеличение точности в 2 раза не поспособствовало изменению результата
0
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
01.03.2013, 21:01  [ТС] #9
1.инженерный калькулятор показал что за тем числом.
2.программа идеально считала без дробей, но вот с дробями получается вот такое отставание. пр ичем при изменении точности результат меняется, просто 1Е-5 и так достаточно большая точность

Добавлено через 3 часа 6 минут
Ап, что, не кто не знает как решить эту дилему?
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
01.03.2013, 21:14 #10
Вы теряете точность при вычислении суммы,скорее всего. И скорее всего, этот алгоритм не подходит для дробных степеней.
Да, и с вещественными не подходит abs, нужно использовать fabs.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
//#include <conio.h>;
#include <math.h>
double sum(double , double );
int main()
{
    double x,k,prec,y,z;
    int p;
    //printf("enter number \n");
    //scanf(" %f",&x);
    //printf("enter degree\n");
    //scanf(" %f",&k);
    //printf("enter accuracy \n");
    //scanf(" %f",&prec);
    x=0.25;
    k=4.;
    y=1;
    p=k;
    if (x==0) {
        printf("x=0");
    }
    if ((x>0) && (k>0)) {
        printf("result:  %f \n",sum (x,k));
    }
    if ((x>0) && (k<0)) {
        z=1/sum(x,fabs(k));
        printf("result:  %f \n",z);
    }
    if ((x<0) && (k>0) && ((p%2)!=0)) {
        z=sum(fabs(x),k)-2*sum(fabs(x),k);
        printf("result:  %f \n",z);
    }
    if ((x<0) && (k<0) && ((p%2)!=0)) {
        z=1/(sum(fabs(x),fabs(k))-2*sum(fabs(x),fabs(k)));
        printf("result:  %f \n",z);
    }
    if ((x<0) && ((p%2)==0)) {
        printf("inccorect, if x<0, degree must be unparne");
    }
    if (k==0) {
        printf("  degree cant be zero");
    }
    return 0;
}
double sum(double x, double k)
{
    double yk, prec=1e-6, y=1.0, b;
    int i;
    do {
        yk=y;
        for (i=k-1; i>1; i-=1) yk=y*yk; //????? здесь вы иеряете точность
        b=(1/k)*((x/yk)-y);
        if (fabs(b)>prec) y=y+b;
    } while (fabs(b)>prec);
    return y;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 21:14
Привет! Вот еще темы с ответами:

Табулировать функции F и S при заданной точности E, с указанным шагом и диапазоном значений по x: - C++
Помогите пожалуйста написать прогу Табулировать функции F и S при заданной точности E, с указанным шагом и диапазоном значений по x:

Вычислить сумму ряда. Вычисления заканчивать при достижении заданной степени точности - C++
Помогите пожалуйста доработать программу, в программировании новичок. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace...

RC4 увеличение файла при шифровании - C++
реализую шифрование текстового файла шифром RC4 расшифровка - просто применение алгоритма же к шифрованному тексту. но исходный я не...

Увеличение индекса в цикле при каждом заходе в функцию - C++
Добрый день столкнулся с маленькой проблемкой код ниже немогу чёта понять почему у меня не увеличивается итератор при каждом заходе в...


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

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

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