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

回答編集履歴

4

コードの不備修正

2020/12/15 23:00

投稿

退会済みユーザー
answer CHANGED
@@ -6,14 +6,14 @@
6
6
 
7
7
  ```diff
8
8
  -double naiseki(double veca[], double vecb[],int n)
9
- +double naiseki(double veca[], double vecb[])
9
+ +double naiseki(const double veca[], const double vecb[])
10
10
  {
11
11
  int i;
12
12
  - double ans;
13
- + double ans = 0;
13
+ + double ans = 0.;
14
14
 
15
15
  - for (i=0; i<=3; i++)
16
- + for (i=0; i<3; i++)
16
+ + for (i=0; i<3; ++i)
17
17
  {
18
18
  ans = ans + veca[i]*vecb[i];
19
19
  }
@@ -30,10 +30,10 @@
30
30
  ```c
31
31
  #include <stdio.h>
32
32
 
33
- double naiseki(double veca[3], double vecb[3])
33
+ double naiseki(const double veca[3], const double vecb[3])
34
34
  {
35
- double ans = 0;
35
+ double ans = 0.;
36
- for(int i=0; i<3; i++) ans = ans + veca[i]*vecb[i];
36
+ for(unsigned i=0; i<3; ++i) ans += veca[i] * vecb[i];
37
37
  return ans;
38
38
  }
39
39
 
@@ -62,10 +62,10 @@
62
62
  //
63
63
  // カハンの加算アルゴリズムを用いた内積
64
64
  //
65
- double naiseki_kahan(double veca[3], double vecb[3])
65
+ double naiseki_kahan(const double veca[3], const double vecb[3])
66
66
  {
67
67
  double y, t;
68
- double sum = 0;
68
+ double sum = 0.;
69
69
  double loss = 0.;
70
70
 
71
71
  for(unsigned i = 0; i < 3; ++i){
@@ -80,10 +80,10 @@
80
80
  //
81
81
  // 通常の内積
82
82
  //
83
- double naiseki(double veca[3], double vecb[3])
83
+ double naiseki(const double veca[3], const double vecb[3])
84
84
  {
85
- double ans = 0;
85
+ double ans = 0.;
86
- for(int i=0; i<3; i++) ans = ans + veca[i]*vecb[i];
86
+ for(unsigned i=0; i<3; i++) ans += veca[i] * vecb[i];
87
87
  return ans;
88
88
  }
89
89
 

3

一部修正

2020/12/15 23:00

投稿

退会済みユーザー
answer CHANGED
@@ -60,25 +60,25 @@
60
60
  #include <stdio.h>
61
61
 
62
62
  //
63
- // カハンの加算アルゴリズムを用いた内積
63
+ // カハンの加算アルゴリズムを用いた内積
64
64
  //
65
65
  double naiseki_kahan(double veca[3], double vecb[3])
66
66
  {
67
67
  double y, t;
68
- double sum = veca[0] * vecb[0];
68
+ double sum = 0;
69
69
  double loss = 0.;
70
-
70
+
71
- for(unsigned i = 1; i < 3; ++i){
71
+ for(unsigned i = 0; i < 3; ++i){
72
72
  y = veca[i] * vecb[i] - loss;
73
- t = sum + y;
73
+ t = sum + y;
74
- loss = (t - sum) - y;
74
+ loss = (t - sum) - y;
75
- sum = t;
75
+ sum = t;
76
76
  }
77
77
  return sum;
78
78
  }
79
79
 
80
80
  //
81
- // 通常の内積
81
+ // 通常の内積
82
82
  //
83
83
  double naiseki(double veca[3], double vecb[3])
84
84
  {
@@ -91,13 +91,13 @@
91
91
  {
92
92
  double vec1[] = {10000000000000000., 1., 1.};
93
93
  double vec2[] = {1., 1., 1.};
94
-
94
+
95
95
  double result = naiseki(vec1, vec2);
96
96
  double result_kahan = naiseki_kahan(vec1, vec2);
97
-
97
+
98
98
  printf("use normal :%lf\n", result);
99
99
  printf("use kahans sum :%lf\n", result_kahan);
100
-
100
+
101
101
  /*--------------------------------------------
102
102
  use normal :10000000000000000.000000
103
103
  use kahans sum :10000000000000002.000000

2

記載漏れ修正

2020/12/15 18:53

投稿

退会済みユーザー
answer CHANGED
@@ -21,7 +21,7 @@
21
21
  }
22
22
  ```
23
23
 
24
- ちなみに余談ですが上記コードでは
24
+ ちなみに余談ですが上記コードでは内積関数の内部の総和部分で
25
25
  [情報落ち](https://mathwords.net/marumegosa#i-5)で発生する誤差が蓄積されてしまう問題
26
26
  への対策が行われていないので下記コードのような
27
27
  状況で誤差によりおかしな結果となってしまいます。
@@ -54,7 +54,7 @@
54
54
  ```
55
55
 
56
56
  なので[カハンの加算アルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%8F%E3%83%B3%E3%81%AE%E5%8A%A0%E7%AE%97%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)を用いて
57
- やれば誤差を抑えたコードのほうが適切かもしれません。
57
+ 誤差を抑えたコードのほうが適切かもしれません。
58
58
 
59
59
  ```c
60
60
  #include <stdio.h>

1

不備修正

2020/12/15 18:47

投稿

退会済みユーザー
answer CHANGED
@@ -22,7 +22,8 @@
22
22
  ```
23
23
 
24
24
  ちなみに余談ですが上記コードでは
25
- [情報落ち](https://mathwords.net/marumegosa#i-5)への対策行われていないので下記コードのよ
25
+ [情報落ち](https://mathwords.net/marumegosa#i-5)で発生する誤差蓄積されてしま問題
26
+ への対策が行われていないので下記コードのような
26
27
  状況で誤差によりおかしな結果となってしまいます。
27
28
 
28
29
 
@@ -96,5 +97,10 @@
96
97
 
97
98
  printf("use normal :%lf\n", result);
98
99
  printf("use kahans sum :%lf\n", result_kahan);
100
+
101
+ /*--------------------------------------------
102
+ use normal :10000000000000000.000000
103
+ use kahans sum :10000000000000002.000000
104
+ *///------------------------------------------
99
105
  }
100
106
  ```