2011-08-17 8 views
1

NANINF-INFの入力が正しく処理されるようにいくつかのコードをテストします。通貨の値をNAN、INFまたは-INFに設定しますか?

iはthere exists functions that returnNANINF-INF知っているが、Doubleとして:私の場合を除き

unit IEEE754; 
... 
function NAN: Double; 
function PositiveInfinity: Double; 
function NegativeInfinity: Double; 

私はCurrencyは、これらの3つのエッジの場合の値のうちの1つである場合をテストする必要があります。残念ながらあなたはDoubleにこれらのいずれかを変換することはできません。CurrencyDoubleNANを変換する際

Test(NAN); 

procedure Test(const Value: Currency); 
    ... 

EInvalidOp無効な浮動小数点演算は例外があります。

NANCurrencyに割り当てることはできますか?

おそらく、むしろそれはNANCurrencyを割り当てる可能であるよりも、それが代わりではない可能 - と私はこのエッジケースを無視することができます。

このエッジケースを無視できますか?

"通貨の値をNAN、INF、または-INFに設定できますか?"


{ David Heffernan says it's impossible for a currency to contain INF,-INF or NAN. 
    So there's no need to test for it. 
    http://stackoverflow.com/questions/7096966/set-a-currency-value-to-nan-inf-or-inf 

    //Handle NaN, where exponent is -32767 
    test(NAN, 'NAN'); 

    //Handle +inf, where exponent is 32767 and Negative is true 
    test(PositiveInfinity, 'INF'); 

    //Handle -inf, where expondent is 32767 and Negative is true 
    test(NegativeInfinity, '-INF'); 
} 
+0

あなたの追加のコードはどうなっていますか?通貨**に指数**はありません。 –

+0

あなたはコードのスニペットを見ていて、何をテストしているのか分かりません。 'Exponent'は、あなたが思い出しているように、通貨を' Digits'と 'Exponent'に変換するDelphiの' FloatToDecimal'によって返される "Exponent"です。 (http://stackoverflow.com/questions/7069204/how-to-convert-float-or-currency-to-a-localized-string) –

+0

確かに。私はあなたが理解できるコード以外のコードを見ていません。だからなぜそれが掲示されたのだろうか。私はFloatToDecimalが何をしているかを知っています、そして、それはCurrencyパラメータの場合にあなたが期待するものではありません**。私はあなたのコードが何らかの証拠であると思われますが、誰もそれに従うことができないので、その目的にはうまく機能しません。 –

答えて

11

通貨は、IEEE754のfloat型ではなく、NANまたはINF値はありません。

documentationは、通貨が10000の暗黙のスケールで64ビット整数として実装され、可能な値の範囲が-922337203685477.5808〜922337203685477.5807であると説明しています。これは64ビット整数の全範囲をカバーするので、NANまたはINFのようなセンチネル値に利用可能なビットパターンは存在しない。

+0

私が尋ねる唯一の理由は、 'FloatToDecimal'(' Currency'値で呼び出すことができる)が 'TFloatRec'を返すからです。 'TFloatRec'は、元の値が' INF/-INF/NAN'だったときに 'Exponent'の値を文書化します。私はこれらの可能性を文書化している関数は、私はそれを正しく処理することを確認したいと思います。しかし、 'Currency'が与えられたときにDelphiの' FloatToDecimal'が 'INF/-INF/NAN'を返すことを保証しているなら、私はそのケースを無視し、不可能として文書化します。 (現時点でクラッシュがある場合は、「しかし、そのWebサイトのその人は起こることはないと言っています」) –

+3

通貨は暗黙の倍率が10000であるInt64です。丸め誤差を避けるために、ベース10算術で。間違いなくNANまたはINFはありません。あなたは梨の形になったら私を責めることができます。 –

+2

Ian、 'Currency'は倍精度64ビット整数であり、浮動小数点型ではありません。すべてのビットパターンが実際の値を表しているため、非数値を表すことは不可能です。それはすべての値が10000で除算されることを除いて、Int64と同じ範囲を持っています。 –

関連する問題