2009-04-30 13 views

cevap

2

0.0/0.0.

basit yolu 0.0/0.0 kullanmaktır
def aNaN 
    s, e, m = rand(2), 2047, rand(2**52-1)+1 
    [sprintf("%1b%011b%052b", s,e,m)].pack("B*").unpack("G").first 
end 
+0

rror: by bölünmüş 0 –

+0

Hangi Ruby sürümünü kullanıyorsunuz? –

+1

Not: 0/0 bir ZeroDivisionError verir, ancak 0.0/0.0 değil. – Kudu

17

:

Pesto tarafından bağlanan iplik kayan noktalı sayılar IEEE 754'e uygun gerçekleştirilmiş olan yerlerde platformlarda çalışmalıdır bu işlevi vardır. "NaN" .to_f çalışmıyor ve neden hakkında bazı tartışmalar var in this thread. Eğer bir numara NaN olup olmadığını test etmek gerekirse

+4

'0/0.0' da çalışır .. (PS. BU INSANE!) –

30

, üzerinde #nan? kullanabilirsiniz:

ruby-1.8.7-p352 :008 > (0/0.0).nan? #=> true 
ruby-1.8.7-p352 :009 > (0/1.0).nan? #=> false 
45

Yakut NaN değerini almak için bir constant var 1.9.3 yana

Float::NAN 
=> NaN 
+0

Bu sabit [1.9.2] 'den beri kullanılabilir (https://github.com/ruby/ruby/blob/trunk/doc/NEWS -1.9.2 # L87). – cremno

+1

Bu, kabul edilen yanıttan çok daha etkileyici. –

0

Rails'e bir değişken atamak böylece (birim testi için yararlı): ZeroDivisionE'yi veren

o.amount = BigDecimal.new('NaN') 
expect(o.valid?).to be false