#python #c #math
#python #c #математика
Вопрос:
Итак, я попытался написать программу на C, которая будет аппроксимировать косинус, используя ряд Тейлора:
#include <stdio.h>
#include <math.h>
int main() {
printf("degreestTaylortcos(degrees)n");
for (double i=0; i<=90; i ) {
double factorial=1;
double x,xn=1;
x=i/(180/M_PI);
double y=1;
for (int i=1; i<30; i ) {
factorial*=i;
xn*=x;
y =((i%3==0)?(1):(i%3==1)?(0):(-1))*xn/factorial;
}
printf("%lft%lft%lfn",i,y,cos(x));
}
}
Однако ошибка для 90 градусов составляет более 1/3:
Я думал, что ошибка произошла из-за числовой нестабильности, вызванной double
типом C. Однако, когда я переписал свою программу на Python, я получил почти тот же результат:
import math
print("degreestTaylortcos(degrees)tdeviance")
for degrees in range(0,90 1):
factorial=1
x=degrees/(180/math.pi)
xn=1
y=1
for i in range(1,50):
factorial=factorial*i
xn=xn*x
multiplicator=0
if i % 3 == 0:
multiplicator=1
elif i % 3 == 1:
multiplicator=0
else:
multiplicator=-1
y=y multiplicator*xn/factorial
print(str(degrees) "t" str(y) "t" str(math.cos(x)) "t" str(abs(y-math.cos(x))))
Вы хоть представляете, что здесь происходит? Используя первые 50 членов из ряда Тейлора, он должен быть почти неотличим от реальной функции косинуса. Но это не так.
Комментарии:
1. Внутренняя реализация Python использует то же
double
, что и C.2. @Max: это зависит от реализации Python. Python не устанавливает стандарт или требование. И C.
Ответ №1:
Ваша ошибка заключается в i % 3
. Термины для косинуса идут 1, 0, -1, 0, 1, 0, -1, 0….