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

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

Восстановить пароль Регистрация
 
Baium
1 / 1 / 0
Регистрация: 01.03.2013
Сообщений: 20
01.03.2013, 16:56     Увеличение точности при подсчетах #1
Есть полностью рабочая программа, она находит корень К из числа Х с точностью 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 обычно хватает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 16:56     Увеличение точности при подсчетах
Посмотрите здесь:

C++ Как посчитать значение при потери точности?
C++ Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0.
Написать программу, демонстрирующую потери точности при арифметических операциях C++
Вычислить сумму ряда. Вычисления заканчивать при достижении заданной степени точности C++
C++ Табулировать функции F и S при заданной точности E, с указанным шагом и диапазоном значений по x:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:16     Увеличение точности при подсчетах #2
Цитата Сообщение от Baium Посмотреть сообщение
дробовыми числами
С дробовыми числами вообще ухо востро держать нужно

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

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

Добавлено через 3 часа 6 минут
Ап, что, не кто не знает как решить эту дилему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 21:14     Увеличение точности при подсчетах
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
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;
}
Yandex
Объявления
01.03.2013, 21:14     Увеличение точности при подсчетах
Ответ Создать тему
Опции темы

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