KDO's Note 1997

2008年 4月 1日 掲載


注意

このページはもとが KDO の個人的なメモであり, 内容の正しさは保証できません.

使ってみておかしいと感じたら, ただちに使用を中止して, 自分で調べなおすなり, 計算しなおすなりしてください.


目次


1997年 9月 3日:圧力の単位 psi

仕事で使う潮位計が水圧式なのだが,データの単位が psi だった. で,SI単位系への変換式をメモ.

psi = Pound per Square Inch

1psi = 1lbf/inch2 = 0.45359243kgf/(0.0254m)2 = 703.0696kgf/m2 = 6890.082Pa

1気圧≒1013hPa≒14.7psi


1997年 8月 14日:double型から int型へ(int,floor)

C言語で,実数を整数に変換するには, int型に型キャストする方法と, 数値計算ライブラリ(libm)の floor関数を使う方法の 2つの方法がある. 負の値について結果が異なるので,使い分けに注意する必要がある.

int型への型キャストでは小数点以下の数が切り捨てられる. floor関数では,その数値以下の最大の整数が返ってくる

int と floor

なお,floor の戻り値は int ではなく double である. また,使用する際は math.h を include し, コンパイルオプション -lm を忘れないように注意すること.


1997年 6月 16日:地球上の 2点間の距離と方位計算(簡易版)

地球上の 2点間の距離と方位について計算する方法を考えてみた.

ここでは,簡単のため地球を完全な球体と仮定しているので, 厳密な値とは異なることに注意が必要である.

緯度φ,経度λの地点 X は,xyz座標系では,

xyz の式

と表される.ここで r は地球の半径.

座標系
(x, y, z)と(λ, φ)の関係図

X0(λ0,φ0)から X1(λ1,φ1)までの距離 rα と方位 β は,

距離 rα
方位 β

と表される.

距離 rα の α は,余弦定理から簡単に求められる.

距離 α

距離 αの導出

方位 β は,X0NO面と X0X1O面のなす角度である.

方位 β

全体を z軸まわりに -λ0 回転させたあと, y軸まわりに -φ0回転させると,OX0' が x軸と一致し, X0'NO面が zx面(y=0)と一致する. 角度β は,X0'X1'O面とzx面のなす角度, すなわち yz平面(x=0)上での OX1'のyz成分の z軸からの角度になる.

ここで,z軸まわりの λ回転は,

λ回転

y軸まわりの φ回転は,

φ回転

である.


1997年 5月 30日:ユリウス日

年月日とユリウス日の変換式を C で書いたものを掲載する. Meeus の式がもとになっている (参考文献:新こよみ便利帳,暦計算研究会編,恒星社厚生閣). 最近 100年程度のデータしかあつかわないので, グレゴリオ歴(1582年 10月 15日以降)以降の日付に特化した.

まずは,年月日時 ymdh(UTC) → ユリウス日 J(ソース ymd2j.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  int y, m, d, A, B, C;
  double J, h;

  y = atoi(argv[1]); /* year */
  m = atoi(argv[2]); /* month */
  d = atoi(argv[3]); /* day */
  h = atof(argv[4]); /* time(h, UTC) */

  if ( m <= 2 ){
    y -= 1;
    m += 12;
  }

  A = (int)( y / 100 );
  B = 2 - A + (int)( A / 4 );
  C = (int)( 365.25 * y );

  J = 1720994 + (int)( 30.6001 * ( m + 1 ) ) + B + C + d + h / 24 + 0.5;

  printf("%f\n", J);

  return 0;
}

次に,ユリウス日時 J → 年月日時 ymdh(UTC)(ソース j2ymd.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  int y, m, d, Z, A, B, C, D, E, K;
  double J, h, N;
  
  J = atof(argv[1]); /* Julian day */

  N = J + 0.5;
  Z = (int)N;
  h = ( N - Z ) * 24;

  A = (int)( ( Z - 1867216.25 ) / 36524.25 );
  B = Z + 1 + A - (int)( A / 4) + 1524;
  C = (int)( ( B - 122.1 ) / 365.25 );
  K = (int)( 365.25 * C );
  E = (int)( ( B - K ) / 30.6001 );
  D = B - K - (int)( 30.6001 * E );
  
  printf("%d\n",E);
  if ( E < 13.5 ){
    m = E - 1;
  } else {
    m = E - 13;
  }

  if ( m > 2.5 ){
    y = C - 4716;
  } else {
    y = C - 4715;
  }

  d = D;

  printf("%d %d %d %f\n", y, m, d, h);

  return 0;
}

[ KDO's Note Index にもどる ] [ KDOホームにもどる ]


(C) 2008 KDO