uint
、long
、ulong
およびdecimal
を IEEE 754 倍精度浮動小数点値として表す必要があるデータ型変換を実行しています。変換を実行する前に、IEEE 754 データ型に値を含めることができないかどうかを検出できるようにしたいと考えています。
強引な解決策は、キャストの周りに try-catch をラップして、 をダブル検索することですOverflowException
。特定のCLR ドキュメントを読むと、一部の変換では例外なく値が暗黙的に変更されることがわかります。
このチェックを行う簡単な方法はありますか? 実装の容易さよりも完全性を求めています。IEEE 754仕様をよく読んで、マティッサと指数を注意深くチェックするつもりだと思います...
私は、整数を正確に表現することに最も関心があり、浮動小数点の精度の低下は二次的な懸念事項であることを付け加えておきます (ただし、検討する価値はあります)。
編集: Int32 は IEE-754 として完全に表現できます。また、Decimal
データ型も問題の大部分です。
重要な更新:この質問を参照している場合は、次の質問も読む必要があります: IEEE-754 Double (64-bit float) vs. Long (64-bit Integer) Revisited
一部の非常に大きな値もIEEE-754で正確に表現できるという回答の欠陥に注意してください。これは値が正しく往復することを意味するかもしれませんが、私の本来の目的 (JavaScript に往復するかどうか) ではそうではありません。
また、CLR の System.Double 型にもバグがあるようです。これは、これらの値の往復が正しく許可されていないためです。