回答編集履歴
4
コードの不備修正
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;
|
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(
|
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(
|
86
|
+
for(unsigned i=0; i<3; i++) ans += veca[i] * vecb[i];
|
87
87
|
return ans;
|
88
88
|
}
|
89
89
|
|
3
一部修正
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 =
|
68
|
+
double sum = 0;
|
69
69
|
double loss = 0.;
|
70
|
-
|
70
|
+
|
71
|
-
for(unsigned i =
|
71
|
+
for(unsigned i = 0; i < 3; ++i){
|
72
72
|
y = veca[i] * vecb[i] - loss;
|
73
|
-
|
73
|
+
t = sum + y;
|
74
|
-
|
74
|
+
loss = (t - sum) - y;
|
75
|
-
|
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
記載漏れ修正
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
不備修正
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
|
```
|