Вычисление значений функции на отрезке [0, 0.5]. Затык с float - C (СИ)
Формулировка задачи:
Требовалось составить программу на Си, которая печатает таблицу значений элементарной функции, вычисленной двумя способами: по формуле Тейлора и с помощью встроенных функций языка программирования. В качестве аргументов таблицы взять точки разбиения отрезка [0, 0.5] на k равных частей.
Для начала, я взял k = 20.
Проблема в том, что delta x, вычисленный по формуле ( ( b - a ) / k ) != 0.025 (delta x = 0.025000000372529029846191406250), из-за этого x останавливается на 0.475 не доходя до 0.5;
Подскажите, что можно сделать, чтобы delta x вычислялось ровно.
Вот мой код:
#include <stdio.h> #include <math.h> const float a = 0.0, b = 0.5; const int k = 20; float findent ( float x ) { return x; } float next ( float x, float n ) { return ( ( ( - 4 ) * x * x ) / ( ( 2 * n + 1 ) * ( 2 * n + 2 ) ) ); } float epsylone() { float eps = 1.0; while ( findent ( eps / 2 + 1 ) > 1 ) { eps /= 2; } return eps; } int main() { int n; float sum, x, add, math, eps = epsylone(); printf ( "epsylone = %g\n\na = %f, b = %f\n\ndelta x = %.30f\n\n", eps,a, b, ( b - a ) / k ); printf ( "x sumTeylor <math.h> n\n" ); for ( x = a; x <= b; x = x + ( ( b - a ) / k ) ) { math = 2 * ( pow( cos( x ), 2 ) - 1 ); n = 1; sum = add = ( - 4 * x * x ) / 2; while ( ( n < 100 ) && ( ( sum + ( add * next ( x, n ) ) ) != sum ) ) { add = add * next ( x, n ); sum = sum + add; n++; } printf ( "%.3f\t%.10f\t%.10f\t%d\n", x, sum, math, n); } printf ( "\n" ); return 0; }
Решение задачи: «Вычисление значений функции на отрезке [0, 0.5]. Затык с float»
textual
Листинг программы
for ( i = 1; i<=k; i++) { x=a+(Float)i/k*(b-a) . . .
Объяснение кода листинга программы
- В цикле
for
переменнойi
присваивается значение 1 и выполняется условиеi <= k
. - Внутри цикла переменной
x
присваивается значениеa + (Float) i/k * (b-a)
. - Далее выполняются действия, которые не показаны в коде.
- После выполнения всех действий цикл повторяется до тех пор, пока значение
i
не станет равнымk
. - Значение переменной
x
используется для вычисления функции на отрезке [0, 0.5]. - Затык связан с использованием типа данных
float
. - Возможно, проблема заключается в неточности вычислений при использовании
float
. - Возможно, проблема заключается в неправильном использовании типа данных
float
. - Возможно, проблема заключается в неправильном приведении типа данных
i
кFloat
. - Возможно, проблема заключается в неправильной постановке задачи.
- Возможно, проблема заключается в неправильном выборе алгоритма для вычисления функции.
- Возможно, проблема заключается в отсутствии проверки на деление на ноль.
- Возможно, проблема заключается в отсутствии проверки на выход значения
i
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
k
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
a
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
b
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
x
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
Float
за пределы отрезка [0, 0.5]. - Возможно, проблема заключается в отсутствии проверки на выход значения
i
за пределы отрезка [1, k]. - Возможно, проблема заключается в отсутствии проверки на выход значения
k
за пределы отрезка [1, 0.5].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д