回答編集履歴

4

コードの不備修正

2020/12/15 23:00

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  -double naiseki(double veca[], double vecb[],int n)
16
16
 
17
- +double naiseki(double veca[], double vecb[])
17
+ +double naiseki(const double veca[], const double vecb[])
18
18
 
19
19
  {
20
20
 
@@ -22,13 +22,13 @@
22
22
 
23
23
  - double ans;
24
24
 
25
- + double ans = 0;
25
+ + double ans = 0.;
26
26
 
27
27
 
28
28
 
29
29
  - for (i=0; i<=3; i++)
30
30
 
31
- + for (i=0; i<3; i++)
31
+ + for (i=0; i<3; ++i)
32
32
 
33
33
  {
34
34
 
@@ -62,13 +62,13 @@
62
62
 
63
63
 
64
64
 
65
- double naiseki(double veca[3], double vecb[3])
65
+ double naiseki(const double veca[3], const double vecb[3])
66
-
66
+
67
- {
67
+ {
68
-
68
+
69
- double ans = 0;
69
+ double ans = 0.;
70
-
70
+
71
- for(int i=0; i<3; i++) ans = ans + veca[i]*vecb[i];
71
+ for(unsigned i=0; i<3; ++i) ans += veca[i] * vecb[i];
72
72
 
73
73
  return ans;
74
74
 
@@ -126,13 +126,13 @@
126
126
 
127
127
  //
128
128
 
129
- double naiseki_kahan(double veca[3], double vecb[3])
129
+ double naiseki_kahan(const double veca[3], const double vecb[3])
130
130
 
131
131
  {
132
132
 
133
133
  double y, t;
134
134
 
135
- double sum = 0;
135
+ double sum = 0.;
136
136
 
137
137
  double loss = 0.;
138
138
 
@@ -162,13 +162,13 @@
162
162
 
163
163
  //
164
164
 
165
- double naiseki(double veca[3], double vecb[3])
165
+ double naiseki(const double veca[3], const double vecb[3])
166
-
166
+
167
- {
167
+ {
168
-
168
+
169
- double ans = 0;
169
+ double ans = 0.;
170
-
170
+
171
- for(int i=0; i<3; i++) ans = ans + veca[i]*vecb[i];
171
+ for(unsigned i=0; i<3; i++) ans += veca[i] * vecb[i];
172
172
 
173
173
  return ans;
174
174
 

3

一部修正

2020/12/15 23:00

投稿

退会済みユーザー
test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
  //
124
124
 
125
- // カハンの加算アルゴリズムを用いた内積
125
+ // カハンの加算アルゴリズムを用いた内積
126
126
 
127
127
  //
128
128
 
@@ -132,21 +132,21 @@
132
132
 
133
133
  double y, t;
134
134
 
135
- double sum = veca[0] * vecb[0];
135
+ double sum = 0;
136
136
 
137
137
  double loss = 0.;
138
138
 
139
-
140
-
139
+
140
+
141
- for(unsigned i = 1; i < 3; ++i){
141
+ for(unsigned i = 0; i < 3; ++i){
142
142
 
143
143
  y = veca[i] * vecb[i] - loss;
144
144
 
145
- t = sum + y;
145
+ t = sum + y;
146
-
146
+
147
- loss = (t - sum) - y;
147
+ loss = (t - sum) - y;
148
-
148
+
149
- sum = t;
149
+ sum = t;
150
150
 
151
151
  }
152
152
 
@@ -158,7 +158,7 @@
158
158
 
159
159
  //
160
160
 
161
- // 通常の内積
161
+ // 通常の内積
162
162
 
163
163
  //
164
164
 
@@ -184,19 +184,19 @@
184
184
 
185
185
  double vec2[] = {1., 1., 1.};
186
186
 
187
-
187
+
188
188
 
189
189
  double result = naiseki(vec1, vec2);
190
190
 
191
191
  double result_kahan = naiseki_kahan(vec1, vec2);
192
192
 
193
-
193
+
194
194
 
195
195
  printf("use normal :%lf\n", result);
196
196
 
197
197
  printf("use kahans sum :%lf\n", result_kahan);
198
198
 
199
-
199
+
200
200
 
201
201
  /*--------------------------------------------
202
202
 

2

記載漏れ修正

2020/12/15 18:53

投稿

退会済みユーザー
test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- ちなみに余談ですが上記コードでは
47
+ ちなみに余談ですが上記コードでは内積関数の内部の総和部分で
48
48
 
49
49
  [情報落ち](https://mathwords.net/marumegosa#i-5)で発生する誤差が蓄積されてしまう問題
50
50
 
@@ -110,7 +110,7 @@
110
110
 
111
111
  なので[カハンの加算アルゴリズム](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)を用いて
112
112
 
113
- やれば誤差を抑えたコードのほうが適切かもしれません。
113
+ 誤差を抑えたコードのほうが適切かもしれません。
114
114
 
115
115
 
116
116
 

1

不備修正

2020/12/15 18:47

投稿

退会済みユーザー
test CHANGED
@@ -46,7 +46,9 @@
46
46
 
47
47
  ちなみに余談ですが上記コードでは
48
48
 
49
- [情報落ち](https://mathwords.net/marumegosa#i-5)への対策行われていないので下記コードのよ
49
+ [情報落ち](https://mathwords.net/marumegosa#i-5)で発生する誤差蓄積されてしま問題
50
+
51
+ への対策が行われていないので下記コードのような
50
52
 
51
53
  状況で誤差によりおかしな結果となってしまいます。
52
54
 
@@ -194,6 +196,16 @@
194
196
 
195
197
  printf("use kahans sum :%lf\n", result_kahan);
196
198
 
199
+
200
+
201
+ /*--------------------------------------------
202
+
203
+ use normal :10000000000000000.000000
204
+
205
+ use kahans sum :10000000000000002.000000
206
+
207
+ *///------------------------------------------
208
+
197
209
  }
198
210
 
199
211
  ```