回答編集履歴

5

pi2 -> pi/2

2022/01/10 09:01

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
 
84
84
 
85
- x の範囲は [0, pi2] を想定しています。
85
+ x の範囲は [0, pi/2] を想定しています。
86
86
 
87
87
  もっとちゃんと言うと、sin_ は [-pi/2, pi]、cos_ は [0, pi] です。
88
88
 

4

追記2

2022/01/10 09:01

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -71,3 +71,23 @@
71
71
  90 1.000000 0.000000
72
72
 
73
73
  ```
74
+
75
+ **追記2**
76
+
77
+ このコードが完璧なものだとは思わないでください。
78
+
79
+
80
+
81
+ x が小さい場合、ループを 10回まわる必要はありません。
82
+
83
+
84
+
85
+ x の範囲は [0, pi2] を想定しています。
86
+
87
+ もっとちゃんと言うと、sin_ は [-pi/2, pi]、cos_ は [0, pi] です。
88
+
89
+ だから、x がその範囲にない時は修正しないと精度が悪くなります。
90
+
91
+
92
+
93
+ では、どのように修正すればいいか分かりますか?

3

pi の値の修正

2022/01/10 07:51

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- const double pi = 3.141592653689793238;
15
+ const double pi = 3.141592653589793238;
16
16
 
17
17
 
18
18
 

2

コードの修正

2022/01/10 05:37

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -30,13 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- double cos_(double x)
34
-
35
- {
36
-
37
- return sin_(pi/2 - x);
33
+ double cos_(double x) { return sin_(pi/2 - x); }
38
-
39
- }
40
34
 
41
35
 
42
36
 

1

追記

2022/01/10 02:04

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1,3 +1,79 @@
1
1
  math.h の代わりに cmath を使えばよいのでは?
2
2
 
3
3
  または `extern "C" double sin(double), cos(double);` と書くとか。
4
+
5
+
6
+
7
+ **追記**
8
+
9
+ ```C++
10
+
11
+ #include <iostream>
12
+
13
+
14
+
15
+ const double pi = 3.141592653689793238;
16
+
17
+
18
+
19
+ double sin_(double x)
20
+
21
+ {
22
+
23
+ double t = x, y = x;
24
+
25
+ for (int i = 3; i < 22; i += 2) y += t *= x * x / ((i-1) * -i);
26
+
27
+ return y;
28
+
29
+ }
30
+
31
+
32
+
33
+ double cos_(double x)
34
+
35
+ {
36
+
37
+ return sin_(pi/2 - x);
38
+
39
+ }
40
+
41
+
42
+
43
+ int main()
44
+
45
+ {
46
+
47
+ std::fixed(std::cout);
48
+
49
+ for (int i = 0; i <= 90; i += 15) {
50
+
51
+ double x = pi / 180 * i;
52
+
53
+ std::cout << i << " " << sin_(x) << " " << cos_(x) << '\n';
54
+
55
+ }
56
+
57
+ }
58
+
59
+ ```
60
+
61
+ 実行結果
62
+
63
+ ```text
64
+
65
+ 0 0.000000 1.000000
66
+
67
+ 15 0.258819 0.965926
68
+
69
+ 30 0.500000 0.866025
70
+
71
+ 45 0.707107 0.707107
72
+
73
+ 60 0.866025 0.500000
74
+
75
+ 75 0.965926 0.258819
76
+
77
+ 90 1.000000 0.000000
78
+
79
+ ```