Вычисление значений функции на отрезке [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)
    . . .

Объяснение кода листинга программы

  1. В цикле for переменной i присваивается значение 1 и выполняется условие i <= k.
  2. Внутри цикла переменной x присваивается значение a + (Float) i/k * (b-a).
  3. Далее выполняются действия, которые не показаны в коде.
  4. После выполнения всех действий цикл повторяется до тех пор, пока значение i не станет равным k.
  5. Значение переменной x используется для вычисления функции на отрезке [0, 0.5].
  6. Затык связан с использованием типа данных float.
  7. Возможно, проблема заключается в неточности вычислений при использовании float.
  8. Возможно, проблема заключается в неправильном использовании типа данных float.
  9. Возможно, проблема заключается в неправильном приведении типа данных i к Float.
  10. Возможно, проблема заключается в неправильной постановке задачи.
  11. Возможно, проблема заключается в неправильном выборе алгоритма для вычисления функции.
  12. Возможно, проблема заключается в отсутствии проверки на деление на ноль.
  13. Возможно, проблема заключается в отсутствии проверки на выход значения i за пределы отрезка [0, 0.5].
  14. Возможно, проблема заключается в отсутствии проверки на выход значения k за пределы отрезка [0, 0.5].
  15. Возможно, проблема заключается в отсутствии проверки на выход значения a за пределы отрезка [0, 0.5].
  16. Возможно, проблема заключается в отсутствии проверки на выход значения b за пределы отрезка [0, 0.5].
  17. Возможно, проблема заключается в отсутствии проверки на выход значения x за пределы отрезка [0, 0.5].
  18. Возможно, проблема заключается в отсутствии проверки на выход значения Float за пределы отрезка [0, 0.5].
  19. Возможно, проблема заключается в отсутствии проверки на выход значения i за пределы отрезка [1, k].
  20. Возможно, проблема заключается в отсутствии проверки на выход значения k за пределы отрезка [1, 0.5].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы