読者になるhnwの日記この広告は、90日以上更新していないブログに表示しています。2014-01-29Monoで巨大な浮動小数点数を丸めたら無限大になった浮動小数点数TweetMonoのround関数にバグを見つけたよ、という毎度おなじみの話題です。2位で丸めて第1位までにしてみましょう。}}上記コードのコメント部の通り、大きい数を丸めると無限大になることがあります。これは、小数点以下第n位までに丸める処理が、「10^n倍して整数に丸めて10^-n倍する」という処理になっているため、この計算の途中で無限大になってしまうことがあるのです。Monoのソースコードも見てみた対応するMonoの処理を追ってみましょう。MonoのC#コンパイラmcsはC#で書かれています。浮動小数点数のround関数の実装はclass/corlib/System/Math.csに見つかります。away_from_zero);Round関数の第2引数が指定された場合はRound2関数が呼ばれることがわかります。Round2関数の属性に「InternalCall」と書いてあるので、CLI側で定義されている関数呼び出しの意味なのかなと想像できます。実際、Round2関数の実体はMono側に見つかります。以下はmono/metadata/sysmath.cからの抜粋です。p;#endif}すでに説明したとおり、受け取った浮動小数点数を10^n倍している箇所が見つかります。roundかrintのどちらかが無い環境むけのコード(#else部)から怪しい気配がプンプンしますが、こちらの分岐を通る環境は珍しいと思うので、見なかったことにします。12はてなブログをはじめよう!hnwさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。