2016-05-08 12 views
2

大きなDoubleIntegerに変換したいと考えていますが、floorのFrege Haskellの実装ではIntegralのタイプが得られないようです。代わりに、それはJavaのやり方とインターフェースするために実装されているようで、FloatingタイプはDoubleFloating r => r -> Doubleになります。私はroundを使用することができますが、(私はその後、ラウンドを0.5とを減算することができるかもしれませんが)それは切り捨てるのではなく、丸めます。私は、IntまたはLongを使用することに頼らずに、むしろ作業したいと思います。後者と同じくらい、精度はまだ限定されています。任意精度整数型に浮動小数点型フローリングについて移動するFrege Double to Integer

任意の方法?

+1

あなたの減算アプローチは制約が与えられた合理的に聞こえるが、私はフレーゲを使用したことがありません。 – dfeuer

+0

はhttp://stackoverflow.com/questions/17960186/is-there-anyway-to-convert-from-double-to-bigintegerから判断すると1がこれを行うには、いくつかのitermediate表現を必要とします。 – Ingo

答えて

3

この機能は実際には利用できません。その理由は、Javaが明らかにそれをサポートするメソッドを提供していないからです。あなたは何ができるか

はStringに倍増し、整数にそれを変換する(床の)変換することです。ここで

は一例です:

frege> import Prelude.Math(floor) 
frege> integerFromDouble d = String.aton ("%.0f".format (floor d)) 
function integerFromDouble :: Math.Floating a => a -> Integer 
frege> integerFromDouble 987654321e20 
0000000000000000000 

何とかダブルから仮数部と指数部を抽出し、整数を計算し、より効果的な方法があるかどうか、私は疑問に思います。

frege> integerFromDouble (5/0) 
java.lang.NumberFormatException: For input string: "Infinity" 

あなたは別にそれを確認するか、String.integerString.atonを置き換える、あなた場合

Either NumberFormatException Integer 

を返すことができ、次のいずれかのNaN、+無限大と-Infinityが存在するため、機能上安全ではないことを

注意

:あなたの計算は Long容量を超えないことを確認することができ、何をしたいがで行うことができます
関連する問題