Реализация расширения Maclaurin Использование python дает два разных ответа для двух разных логик - PullRequest
0 голосов
/ 27 апреля 2020

Чтобы найти sin (1.2), используя расширение Maclaurin, я написал следующий код:

import math as m
N = 25
k=1
s=x
sign = 1

while k<N:
    sign = -sign

    k = k + 2

    term = sign*x**k/m.factorial(k)

    s = s + term

print(s)

Работает нормально и дает 0.9320390859672263

Тогда мой брат написал это как:

x=1.2
s=x
i = 3
flag=0

while(i < 25):
    if(flag==1):
        s += (x**i)/(m.factorial(i))
        flag=0
    if(flag==0):
        s -= (x**i)/(m.factorial(i))
        flag=1
    i += 2

print(s)

И ответ был 0,9119999999999999

Оба логика одинаковы c, но ответ разный. Почему?

1 Ответ

0 голосов
/ 28 апреля 2020

Во второй версии, когда flag равен 1, вы устанавливаете его равным 0, а затем сразу же проверяете его снова. Поскольку flag теперь равно 0, в итоге вы выполняете обе ветви оператора if:

while(i < 25):
    if(flag==1):  # Flag is initially set to 1, so this is True
        s += (x**i)/(m.factorial(i))
        flag=0  # Flag is now set to 0
    if(flag==0):  # Flag just became 0, so this is now True!
        s -= (x**i)/(m.factorial(i))  # This undoes the first calculation
        flag=1
    i += 2

print(s)

В результате код обновляется s только тогда, когда flag равен 0, и фактически ничего не делает когда flag равен 1. Это можно исправить с помощью else или elif, чтобы каждый раз выполнялась только одна ветвь оператора if через l oop:

while(i < 25):
    if(flag==1):
        s += (x**i)/(m.factorial(i))
        flag=0
    else:  # This avoids comparing flag a second time
        s -= (x**i)/(m.factorial(i))
        flag=1
    i += 2

Это дает то же значение, что и ваш первый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...