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

回答編集履歴

2

コード

2018/08/08 06:28

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -2,4 +2,35 @@
2
2
  doubleにするか別のアルゴリズムを探すかです。
3
3
 
4
4
  今回のような近距離だと、大円距離ではなく直線距離で近似するか、
5
- [wikipediaの大円距離のコンピュータによる計算](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97)を使うかです。
5
+ [wikipediaの大円距離のコンピュータによる計算](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97)を使うかです。
6
+
7
+ ```C
8
+ #include <stdio.h>
9
+ #include <math.h>
10
+
11
+ float distance(float x1, float y1, float x2, float y2, float r){
12
+ float pi = 3.1415926535897932384626433832795;
13
+ x1 *= pi/180;
14
+ y1 *= pi/180;
15
+ x2 *= pi/180;
16
+ y2 *= pi/180;
17
+
18
+ float dx = x2 - x1;
19
+ float dy = y2 - y1;
20
+ float sy = sin(dy/2.0);
21
+ float sx = sin(dx/2.0);
22
+ float sigma = sy*sy + cos(y1)*cos(y2)*sx*sx;
23
+ return r *2.0*asin(sqrt(sigma));
24
+
25
+ }
26
+
27
+ int main(void){
28
+ float x1 = 139.988909;
29
+ float y1 = 35.685828;
30
+ float x2 = 139.990339;
31
+ float y2 = 35.685879;
32
+ float r = 6378.137e3;
33
+
34
+ printf("%f",distance(x1,y1,x2,y2,r)/1e3);
35
+ }
36
+ ```

1

計算方法追加

2018/08/08 06:28

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -1,2 +1,5 @@
1
1
  floatだと桁落ち誤差でdが1になってtmpが0になってしまいます。
2
- doubleにするか別のアルゴリズムを探すかです。
2
+ doubleにするか別のアルゴリズムを探すかです。
3
+
4
+ 今回のような近距離だと、大円距離ではなく直線距離で近似するか、
5
+ [wikipediaの大円距離のコンピュータによる計算](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97)を使うかです。