回答編集履歴
4
コードの不備修正
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;
|
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(in
|
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(in
|
171
|
+
for(unsigned i=0; i<3; i++) ans += veca[i] * vecb[i];
|
172
172
|
|
173
173
|
return ans;
|
174
174
|
|
3
一部修正
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 =
|
135
|
+
double sum = 0;
|
136
136
|
|
137
137
|
double loss = 0.;
|
138
138
|
|
139
|
-
|
140
|
-
|
139
|
+
|
140
|
+
|
141
|
-
for(unsigned i =
|
141
|
+
for(unsigned i = 0; i < 3; ++i){
|
142
142
|
|
143
143
|
y = veca[i] * vecb[i] - loss;
|
144
144
|
|
145
|
-
|
145
|
+
t = sum + y;
|
146
|
-
|
146
|
+
|
147
|
-
|
147
|
+
loss = (t - sum) - y;
|
148
|
-
|
148
|
+
|
149
|
-
|
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
記載漏れ修正
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
不備修正
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
|
```
|