teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

pi2 -> pi/2

2022/01/10 09:01

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  x が小さい場合、ループを 10回まわる必要はありません。
42
42
 
43
- x の範囲は [0, pi2] を想定しています。
43
+ x の範囲は [0, pi/2] を想定しています。
44
44
  もっとちゃんと言うと、sin_ は [-pi/2, pi]、cos_ は [0, pi] です。
45
45
  だから、x がその範囲にない時は修正しないと精度が悪くなります。
46
46
 

4

追記2

2022/01/10 09:01

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -34,4 +34,14 @@
34
34
  60 0.866025 0.500000
35
35
  75 0.965926 0.258819
36
36
  90 1.000000 0.000000
37
- ```
37
+ ```
38
+ **追記2**
39
+ このコードが完璧なものだとは思わないでください。
40
+
41
+ x が小さい場合、ループを 10回まわる必要はありません。
42
+
43
+ x の範囲は [0, pi2] を想定しています。
44
+ もっとちゃんと言うと、sin_ は [-pi/2, pi]、cos_ は [0, pi] です。
45
+ だから、x がその範囲にない時は修正しないと精度が悪くなります。
46
+
47
+ では、どのように修正すればいいか分かりますか?

3

pi の値の修正

2022/01/10 07:51

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ```C++
6
6
  #include <iostream>
7
7
 
8
- const double pi = 3.141592653689793238;
8
+ const double pi = 3.141592653589793238;
9
9
 
10
10
  double sin_(double x)
11
11
  {

2

コードの修正

2022/01/10 05:37

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -14,10 +14,7 @@
14
14
  return y;
15
15
  }
16
16
 
17
- double cos_(double x)
18
- {
19
- return sin_(pi/2 - x);
17
+ double cos_(double x) { return sin_(pi/2 - x); }
20
- }
21
18
 
22
19
  int main()
23
20
  {

1

追記

2022/01/10 02:04

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -1,2 +1,40 @@
1
1
  math.h の代わりに cmath を使えばよいのでは?
2
- または `extern "C" double sin(double), cos(double);` と書くとか。
2
+ または `extern "C" double sin(double), cos(double);` と書くとか。
3
+
4
+ **追記**
5
+ ```C++
6
+ #include <iostream>
7
+
8
+ const double pi = 3.141592653689793238;
9
+
10
+ double sin_(double x)
11
+ {
12
+ double t = x, y = x;
13
+ for (int i = 3; i < 22; i += 2) y += t *= x * x / ((i-1) * -i);
14
+ return y;
15
+ }
16
+
17
+ double cos_(double x)
18
+ {
19
+ return sin_(pi/2 - x);
20
+ }
21
+
22
+ int main()
23
+ {
24
+ std::fixed(std::cout);
25
+ for (int i = 0; i <= 90; i += 15) {
26
+ double x = pi / 180 * i;
27
+ std::cout << i << " " << sin_(x) << " " << cos_(x) << '\n';
28
+ }
29
+ }
30
+ ```
31
+ 実行結果
32
+ ```text
33
+ 0 0.000000 1.000000
34
+ 15 0.258819 0.965926
35
+ 30 0.500000 0.866025
36
+ 45 0.707107 0.707107
37
+ 60 0.866025 0.500000
38
+ 75 0.965926 0.258819
39
+ 90 1.000000 0.000000
40
+ ```