2017-03-09 8 views
3

私のコードでNaNが生成されている場所を見つけようとしています。その目的のために、一般的なNaNが生成されない場合に例外を発生させるRubyの動作。たとえば、NaNを返す代わりに0.0/0.0を試行すると例外が発生します。NaNを返す代わりに例外を発生させる方法

これは可能ではないようですが、おそらく誰かがそれを行う方法を知っています。編集:私はそれを取り戻す、以下の解決策の猿は動作するようです。

+0

ルビーを持っていないモジュールを使用して、あなたのモジュール/クラスのその後

module RaiseExceptionOnNaN refine Float do def /(*) super.tap {|result| raise ZeroDivisionError if result.nan?} end end end 

(Rubyでほとんどの演算子がちょうど方法であることを覚えておいてください)実際にはNaNのデータ型です –

+0

@maxpleそれは "NaN"として示されています。実際に文字列か記号か真正なIEEE 754 NaNかどうかは分かりません。 Float :: NANがありますが、あなたがすでに知っているように、IEEE 754では数字ではないと解釈される一連のビットパターンが存在するため、そのような値は1つだけではありません。私はRubyのソースコードを見て、RubyがIEEE 754 NaNを使用しているように見えますが、私は確信することはできません。あなたがそれについてもっと知っているなら、私は聞くことに興味があるでしょう。 –

+0

私はそれが真正なIEEE 754 NaNだと確信しています。私のリトマステストは '0/0.0 == 0/0.0'かどうかです。 'true'の場合、IEEEではありません。 Ruby(> = 2.2.2以上)では、その式は 'false'と評価されます。 –

答えて

4

することはできモンキーパッチFloat#/洗練を使用して

class MyClass 
    using RaiseExceptionOnNaN 

    # Have a try 
    0.0/0.0 
end 
+0

ありがとう、私はそれを試してみています。私は 'Float.send(:prepend、RaiseExceptionOnNaN)'のようなコードの最後の行を書く必要がありましたが、上に示したように試みたときに 'Float:Class(NoMethodError) 。 –

+0

ありがとう、期待どおりに動作しているようです。 –

+0

この答えにはすごく驚くべきことがあります。私はそれを2回upvoteすることができたらいいなあ。 –

関連する問題