From: Chris Shea Date: 2007-04-18T06:20:12+09:00 Subject: Re: Bug in Float? (was: NaN Error) On Apr 17, 12:41 pm, "Tim Pease" wrote: > I ran across some peculiar behavior yesterday when working with large > floating point values. Here is a small script that demonstrates the > behavior. My question is, is this the expected behavior or is this a > bug in Float? > > > cat float_bug.rb > > puts "ruby #{RUBY_VERSION} " + > "(#{RUBY_RELEASE_DATE} patchlevel #{RUBY_PATCHLEVEL}) " + > "[#{RUBY_PLATFORM}]" > > puts "Float::MAX = #{Float::MAX}" > puts "1.0e+300 = #{1.0e+300}" > puts "1.0e+301 = #{1.0e+301}" > puts "1.0e+308 = #{1.0e+308}" > puts "1.0e+700 = #{1.0e+700}" > > # EOF > > When I run this script on my Windows machine, it produces the output I > would expect -- i.e. numbers above Float::MAX are "Infinity" and > numbers below Float::MAX are valid floating point numbers. > > > ruby -w float_bug.rb > > ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-cygwin] > Float::MAX = 1.79769313486232e+308 > 1.0e+300 = 1.0e+300 > 1.0e+301 = 1.0e+301 > 1.0e+308 = 1.0e+308 > 1.0e+700 = Infinity > > Now, when I run the exact same script on a Solaris machine, some odd > things start to happen > > > ruby -w float_bug.rb > > ruby 1.8.5 (2006-12-25 patchlevel 12) [sparc-solaris2.8] > Float::MAX = 1.79769313486232e+308 > 1.0e+300 = 1.0e+300 > 1.0e+301 = NaN > 1.0e+308 = NaN > 1.0e+700 = 8.55180271847103e+116 > > Whey are valid floats being treated as NaN? Better yet, why does > 1.0e+700 get evaluated to 8.5518027e+116? > > Once more on the Windows 1-click installed version of Ruby. > > > ruby -w float_bug.rb > > ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] > Float::MAX = 1.79769313486232e+308 > 1.0e+300 = 1.0e+300 > 1.0e+301 = NaN > 1.0e+308 = NaN > 1.0e+700 = 1.0e+189 > > Any thoughts on this one? I encourage you to copy the float_bug.rb > script and try it out for yourself. > > Blessings, > TwP On OS X 10.4.9 mvb:~ cms$ ruby float_bug.rb ruby 1.8.6 (2007-03-13 patchlevel 0) Float::MAX = 1.79769313486232e+308 1.0e+300 = 1.0e+300 1.0e+301 = NaN 1.0e+308 = NaN 1.0e+700 = 0.0 And my Xubuntu box (pre-RUBY_PATCHLEVEL apparently): ruby 1.8.4 (2005-12-24)[i486-linux] Float::MAX = 1.79769313486232e+308 1.0e+300 = 1.0e+300 1.0e+301 = 1.0e+301 1.0e+308 = 1.0e+308 1.0e+700 = 0.0