1
1
"""
2
2
https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions
3
3
"""
4
- from math import factorial
4
+ from math import factorial , pi
5
5
6
6
7
7
def maclaurin_sin (theta : float , accuracy : int = 30 ) -> float :
@@ -12,14 +12,18 @@ def maclaurin_sin(theta: float, accuracy: int = 30) -> float:
12
12
:param accuracy: the degree of accuracy wanted minimum ~ 1.5 theta
13
13
:return: the value of sine in radians
14
14
15
+
16
+ >>> from math import isclose, sin
17
+ >>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25))
18
+ True
15
19
>>> maclaurin_sin(10)
16
- -0.54402111088927
20
+ -0.544021110889369
17
21
>>> maclaurin_sin(-10)
18
- 0.54402111088927
22
+ 0.5440211108893703
19
23
>>> maclaurin_sin(10, 15)
20
- -0.5429111519640644
24
+ -0.5440211108893689
21
25
>>> maclaurin_sin(-10, 15)
22
- 0.5429111519640644
26
+ 0.5440211108893703
23
27
>>> maclaurin_sin("10")
24
28
Traceback (most recent call last):
25
29
...
@@ -39,18 +43,28 @@ def maclaurin_sin(theta: float, accuracy: int = 30) -> float:
39
43
"""
40
44
41
45
if not isinstance (theta , (int , float )):
42
- raise ValueError ("maclaurin_sin() requires either an int or float for theta" )
46
+ raise ValueError (
47
+ "maclaurin_sin() requires either an int or float for theta"
48
+ )
43
49
44
50
if not isinstance (accuracy , int ) or accuracy <= 0 :
45
- raise ValueError ("maclaurin_sin() requires a positive int for accuracy" )
51
+ raise ValueError (
52
+ "maclaurin_sin() requires a positive int for accuracy"
53
+ )
46
54
47
55
theta = float (theta )
48
56
57
+ div = theta // (2 * pi )
58
+ theta = theta - (2 * div * pi )
59
+
49
60
total = 0
50
61
for r in range (accuracy ):
51
62
total += ((- 1 ) ** r ) * ((theta ** (2 * r + 1 )) / (factorial (2 * r + 1 )))
52
- return float ( total )
63
+ return total
53
64
54
65
55
66
if __name__ == "__main__" :
67
+ print (maclaurin_sin (10 ))
68
+ print (maclaurin_sin (- 10 ))
56
69
print (maclaurin_sin (10 , 15 ))
70
+ print (maclaurin_sin (- 10 , 15 ))
0 commit comments