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

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

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

Author24 — интернет-сервис помощи студентам
Есть полностью рабочая программа, она находит корень К из числа Х с точностью 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2013, 16:56
Ответы с готовыми решениями:

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

Увеличение точности БПФ
Народ помогите, создал сигнал, выполнил БПФ, нашёл точку( спектральный отсчёт) где спектр сигнала...

Редкая ошибка при подсчетах
Прохожу тесты на Codifity (для общего развития). Одно задание звучит так: &quot;Бинарный разрыв...

Игнорирование Н/Д ячеек при подсчетах
Привет Хочу подсчитать общий балл, начиная от B6 до B13, используя функцию СУММ =СУММ(B6:B13)...

9
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:16 2
Цитата Сообщение от Baium Посмотреть сообщение
дробовыми числами
С дробовыми числами вообще ухо востро держать нужно

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

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

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

Добавлено через 3 часа 6 минут
Ап, что, не кто не знает как решить эту дилему?
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
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
01.03.2013, 21:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2013, 21:14
Помогаю со студенческими работами здесь

Floating point overflow при подсчетах
Здравствуйте Помогите, вот в одном выражении (когда выполняю программу) выдает floating point...

Программа при подсчетах через раз ошибается
program vsesrasy; uses crt; const n=10; type m=array of integer; var mas:m; i,...

Mathcad ошибки в подсчетах
Все находится почти в самом низу файла. Делаю 1 в 1 по примеру, но результаты совершенно другие....

Потеря точности при умножении
# include &lt;stdio.h&gt; main () { float x,y,s; scanf (&quot;%f %f&quot;, &amp;x,&amp;y); s=x*y; printf...


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

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