師匠の散歩

きままにPerlでも

degを度分秒に変換

degをddmmss.xxxxに変換/ subDeg2Dms.cgi

度から度分秒を求める

関数としては良く出てくるものだが、師匠なりのコーディング方法を示す。小数点の丸めは行っていないので、下記の例の小数点の違いは、マシンの計算誤差によるものだ。

サブルーチン

上はWebのサンプル、下は師匠のコーディングテスト版と完成版である。マイナスの値でも対応できるものとしたが、文字と数値の区別をしないPerl独特の文法となってしまった。

参考資料
sub Sample {
  my $sep = "";          # sample では「:」が入っていた
  my $dd = shift;
  my $deg = int($dd);
  my $min = int(($dd-$deg)*60);
  my $sec = ((($dd-$deg)*60)-$min)*60;
  return "$deg$sep$min$sep$sec";
}
師匠のコーディング初期版
sub test {
 my $deg = shift;

 my ($do,$fun,$byo);
 $deg =~ /\./;
 $do  = $`;
 $fun = ($deg-$do)*60;
 $fun =~ /\./;
 $byo = ($fun-$`)*60;
 $fun = $`;
 $byo =~ /\./;
 $byo = $`;
 return sprintf("%3d%02d%02d",$do,$fun,$byo).".".$';
}
師匠のコーディング完成版
# ----------------------------
# deg を dddmmss.sssss に変換
# ----------------------------
sub deg2dms {
  my $deg = shift;
  my ($do,$fun,$byo);
  my $flag=1;           # 元の数値の符号が正ならflag=1
  if ($deg<0) {
    $flag=-1;           # 元の値が負ならflag=-1にして、元の値の符号を反転する
    $deg *=-1;
  }
  $deg =~ /\./;                                # 元の値の「.」でマッチング
  $do = int($deg);                             # 小数点の無い数字の場合、こちらで対応した
  # $do  = $`;                                  # 小数点が無いと対応できなかった
  $fun = ($deg-$do)*60;                        # 分(小数点付き)は、元の数字から度を引いて60をかけたもの
  $fun =~ /\./;                                # 再度ドットでマッチング
  $byo = ($fun-$`)*60;                         # 秒は、小数点を60倍したもの
  $fun = int(($deg-$do)*60);
  # $fun = $`;                                   # 分は、マッチング結果のドットより左の部分
  $byo =~ /\./;                                # もう一度ドットでマッチング
  $byo = $`;                                   # 秒はドットの左側
  $deg = sprintf("%3d%02d%02d",$do,$fun,$byo); # 整数部を整形
  $deg = $deg.".".$';                          # 文字連結によりドット以下を右に付け加える
  $deg *=$flag;                                # 算術計算を入れることで文字から数字にして戻す
  return $deg;
}

テスト結果

小数点の無い数字、マイナスの数字にも対応した。最後の例題では、桁落ち計算、桁繰上げ回答により、60秒なる解が得られてしまい、本来バグとなるべきものだが、一旦ここまでで終了とする。(2011/1/5)


35.12345 (Sample)→  35724.4199999999938
35.12345 (test)→    350724.4199999999938
35.12345 (deg2dms)→ 350724.42

138.0126886 (Sample)→  138045.6789599999638
138.0126886 (test)→    1380045.6789599999638
138.0126886 (deg2dms)→ 1380045.67896

-10.0012345 (Sample)→  -100-4.4442000000025
-10.0012345 (test)→    -1000-4.4442000000025
-10.0012345 (deg2dms)→ -100004.4442

-1.000188583 (Sample)→  -10-0.678898799999672
-1.000188583 (test)→    -10000.678898799999672
-1.000188583 (deg2dms)→ -10000.6788988

-0.000188583 (Sample)→  00-0.6788988
-0.000188583 (test)→    00000.6788988
-0.000188583 (deg2dms)→ -0.6788988

135.206388889 (Sample)→  1351223.0000004000362
135.206388889 (test)  →  1351223.0000004000362
135.206388889 (deg2dms)→ 1351223.0000004

139 (Sample)→  13900
139 (test)→    00000.
139 (deg2dms)→ 1390000
<>
139.2 (Sample)→  1391159.9999999999591
139.2 (test)→    1391159.9999999999591
139.2 (deg2dms)→ 1391160

入力が整数値だと、解(の前に?)に改行が入ってしまう。改行削除などいろいろと操作してみたが改善されず、原因は不明


subDeg2Dms.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18