DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#で角度変換の誤差を無くしたい

環境/言語:[WinXP Pro]
分類:[.NET]

C#で角度変換できる関数を作ろうとしています。
現在デグリー→ラジアンはできました。
ラジアン→デグリーをしようと作ったのですが
どうしても誤差が出てしまいます。

==例==
元の角度は45°32′25″として
DegToRadで「45.54027777....」になります。 //ここまではできました

RadToDegで上記小数表示のものを度分秒の形にすると
どうしても+1秒又は-1秒になってしまいます。


==自作関数==
public static double[] RadToDeg(double radNum)
{
double[] degNum = new double[3];
double dNum;
double mNum;
double sNum;

dNum = Math.Floor(radNum);
mNum = Math.Floor((radNum - dNum) * 60);
sNum = Math.Ceiling((radNum - dNum - (mNum / 60)) * 3600);
degNum[0] = dNum;
degNum[1] = mNum;
degNum[2] = sNum;

return degNum;
}
==ここまで==

どうかお知恵拝借したいと思います
よろしくお願いします

開発環境としては
OS:WinXP Pro
IDE:VS2008
言語:C#.net
.NetVer:2.0
浮動小数点数型の有効数字が有限である以上、誤差は必ず発生するものです。
Math.PI 自体、無理数を double で表現する以上、差が存在していますし。
Angle 構造体を作って、作成時には入力値と入力タイプ(度数法か弧度法か)をそのまま保存し、出力時に必要に応じて変換するような形にすれば、その構造体を使いまわす限りは再変換しなくて済むようになりますね。意義があるシーンは相当限定的かもしれませんが。
と、とりあえずコードも読ます浮動小数点数に関する一般論を挙げてみましたが。
改めてコードを拝見するに、これはラジアンへの変換じゃなくて単に六十進の分・秒を十進の度(の小数点以下)に変換してるだけですね?
度数からラジアンへの変換は π/180 との積で求めますよ。
> sNum = Math.Ceiling((radNum - dNum - (mNum / 60)) * 3600);

  ※ デグリとラジアンの変換は前述の通り・・・

  で、この後に・・・

If (sNum >= 60.0){
sNum = 0.0
mNum += 1.0
If (mNum >= 60.0){
mNum = 0.0
dNum += 1.0
}
}

  このようにしたら、如何?
  これで、Math.Ceilingの効果が出るかと・・・

以上。
追伸・・・

そのままコード書いたので、『;』抜けてます・・・
お恥ずかしい・・・(適宜修正お願い!)

以上。
返信遅くなりました
申し訳ありません。

Hongliangさん
誤差があるのは当然ですよね。
>Angle 構造体を作って、作成時には入力値と入力タイプ(度数法か弧度法か)をそのまま保存し、出力時に必要に応じて変換するような形にすれば、その構造体を使いまわす限りは再変換しなくて済むようになりますね。

まだまだC#を始めたばかりなのでせっかくのお知恵も意味が・・・(-_-;)
構造体造ったこと無いほどの初心者なのでちょっと勉強してみます。



オショウさん
今VSが使えない状態ですが提示いただいたコードを参考にさせていただきます

DOBON.NET | プログラミング道 | プログラミング掲示板