Task 8 is done?

This commit is contained in:
AZEN-SGG 2025-05-11 07:43:19 +03:00
parent c10e3d3bb1
commit 84233f1e84
6 changed files with 101 additions and 11 deletions

View file

@ -44,7 +44,7 @@ static inline int is_null (const double a)
static inline int is_eps (const double a, const double eps)
{
return (((a < 0) ? -a : a) - eps) < DBL_EPSILON;
return ((a < 0) ? -a : a) < eps;
}
#endif

View file

@ -28,7 +28,8 @@ int t4_solve (
for (it = 1; it <= m; ++it)
{
c = b - ((b - a) / (y_b - y_a)) * y_b;
// c = b - ((b - a) / (y_b - y_a)) * y_b;
c = a - ((b - a) / (y_b - y_a)) * y_a;
y = f(c);
if (is_eps(y, eps))

50
2025.05.02/08Ex/comp.h Normal file
View file

@ -0,0 +1,50 @@
#ifndef COMP_H
#define COMP_H
#include <float.h>
#include <math.h>
static inline double * fpmax (double *pa, double *pb, double fa, double fb, double *max_f_p)
{
if ((fa - fb) > DBL_EPSILON)
{
*max_f_p = fa;
return pa;
} else
{
*max_f_p = fb;
return pb;
}
}
static inline double * fp_abs_max (double *pa, double *pb, double *fa, double *fb, double **max_f_p)
{
if ((fabs(*fa) - fabs(*fb)) > DBL_EPSILON)
{
*max_f_p = fa;
return pa;
} else
{
*max_f_p = fb;
return pb;
}
}
static inline int is_equal (const double a, const double b)
{
double diff = a - b;
double max_val = (a > b) ? a : b;
return ((diff < 0) ? -diff : diff) < (DBL_EPSILON * max_val);
}
static inline int is_null (const double a)
{
return ((a < 0) ? -a : a) < DBL_EPSILON;
}
static inline int is_eps (const double a, const double eps)
{
return (((a < 0) ? -a : a) - eps) < DBL_EPSILON;
}
#endif

View file

@ -6,17 +6,54 @@
int t8_solve (
double (*f) (double),
double a, double b,
double eps, int m, double *x
double eps, int m, double *res
) {
int it = 1;
double x_l = 0, y_l = 0, c = a, y = f(a);
double h = a - b;
double x_l = 0, y_l = 0, x = a, y = f(a);
if (fabs(b - a) < DBL_EPSILON)
{
*x = a;
*res = a;
return 1;
}
while (it <= m)
{
h *= -0.1;
while (1)
{
it++;
if (it > m)
return -1;
x_l = x;
y_l = y;
x += h;
if ((a - x) > DBL_EPSILON || (x - b) > DBL_EPSILON) {
*res = x_l;
return it;
}
y = f(x);
if ((y_l - y) > DBL_EPSILON) {
if ((y_l - y) < eps) {
*res = x_l;
return it;
}
break;
}
}
}
return -1;
}
/*
for (double h = (b - a) * 0.1; fabs(h) > DBL_EPSILON; h *= -0.1)
{
do {
@ -54,4 +91,4 @@ int t8_solve (
return it;
}
*/

View file

@ -4,7 +4,7 @@
int t8_solve (
double (*f) (double),
double a, double b,
double eps, int m, double *x
double eps, int m, double *res
);
#endif

View file

@ -1,5 +1,7 @@
script_name="$(basename "$0")"
iter="1000"
eps="1e-14"
if [ "$#" -ne 1 ]; then
echo "Не указан как параметр номер программы"
@ -34,15 +36,15 @@ i=2
for (( k = 3 ; k < 7; k++ )); do
for (( a = -100 ; a < -40 ; a++ )); do
for (( b = -9 ; b < 10 ; b++ )); do
echo "./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k"
echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k)"
echo "./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k"
echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k)"
((i+=2))
done
done
for (( a = -9 ; a < 10 ; a++ )); do
for (( b = 11 ; b < 100 ; b++ )); do
echo "$i ./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k"
echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k)"
echo "$i ./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k"
echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k)"
((i+=2))
done
done