トップ回答者
Complexの計算で0が変な値になる

質問
回答
-
Math.PIなどは無理数ですので、有限の桁数では正しく表現できず、近似値で表現するしかありません。
なので、計算結果も近似値で表現するしかありません。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
-
e^iθ=Cosθ+iSinθであらわせるのはご存じと思いますが、虚部のMath.Sin(Math.PI)が誤差のせいで0にならないというのが原因ですね。
例えばSinθの代わりにSQRT(1-(Cosθ)^2)を使うなどの方法も検討してみてはどうでしょう。(符号に注意が必要です)個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
-
補足で、Math.PIは
public const double PI = 3.14159265358979323846;
と定義されていますし、double自身も16桁程度の精度しかないので、E-16という結果は答えに対して十分近しいかと。
Math.PIの代わりにMath.Atan(1)*4を使っても精度は上がりませんね。
# * 4 とは浮動小数点数において指数部+2となるため、精度に影響しない。
- 編集済み 佐祐理 2017年5月3日 15:03
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
すべての返信
-
Math.PIなどは無理数ですので、有限の桁数では正しく表現できず、近似値で表現するしかありません。
なので、計算結果も近似値で表現するしかありません。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
-
e^iθ=Cosθ+iSinθであらわせるのはご存じと思いますが、虚部のMath.Sin(Math.PI)が誤差のせいで0にならないというのが原因ですね。
例えばSinθの代わりにSQRT(1-(Cosθ)^2)を使うなどの方法も検討してみてはどうでしょう。(符号に注意が必要です)個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
-
補足で、Math.PIは
public const double PI = 3.14159265358979323846;
と定義されていますし、double自身も16桁程度の精度しかないので、E-16という結果は答えに対して十分近しいかと。
Math.PIの代わりにMath.Atan(1)*4を使っても精度は上がりませんね。
# * 4 とは浮動小数点数において指数部+2となるため、精度に影響しない。
- 編集済み 佐祐理 2017年5月3日 15:03
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月8日 2:26
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年5月12日 4:24
-
浮動小数点では必ず丸め誤差が生じるということはご存知ですか?
そんなことは言われなくても百も承知ということでしたら失礼しました。
でも、もしご存じなければ、「浮動小数点」「丸め誤差」などをキーワードにググるといろいろ参考になる記事が見つかると思いますので、やってみてください。
例えば下記:
浮動小数点を利用する際に知っておきたいこと
https://blogs.msdn.microsoft.com/jpvsblog/2014/10/28/93/- 編集済み SurferOnWww 2017年5月4日 22:52 誤記訂正