From: "naruse (Yui NARUSE)" Date: 2013-04-25T06:49:19+09:00 Subject: [ruby-core:54558] [ruby-trunk - Bug #8299] Minor error in float parsing Issue #8299 has been updated by naruse (Yui NARUSE). phasis68 (Heesob Park) wrote: > I found the issue is due to the difference of the floating point precision. > > Here is a patch for this issue: > > diff --git a/numeric.c b/numeric.c.new > index 97ba104..c548c0f 100644 > --- a/numeric.c > +++ b/numeric.c.new > @@ -3767,6 +3767,9 @@ Init_Numeric(void) > _control87(MCW_EM, MCW_EM); > _control87(_control87(0,0),0x1FFF); > #endif > +#if defined(__MINGW32__) > + _control87(_PC_53, _MCW_PC); > +#endif > id_coerce = rb_intern("coerce"); > id_to_i = rb_intern("to_i"); > id_eq = rb_intern("=="); It specify fraction as 53 bit (other IEEE 754 FPU's 52 bit with economized form), but its internal exponent is still 15 bit. For example following result should be still different (I don't tested on mingw32). [0x0008008000000000,0x3ff0000000000001].pack("Q2").unpack("d2").inject(&:*) Therefore use SSE2 rather than such workaround. ---------------------------------------- Bug #8299: Minor error in float parsing https://bugs.ruby-lang.org/issues/8299#change-38875 Author: bobjalex (Bob Alexander) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: trunk Backport: I encountered a float that either parses [slightly] differently (or converts to string differently) in Ruby than it does in Python or Java. This looks like a Ruby bug since the result "looks" incorrect. It is easily reproduced by entering the magic number (-1.1505945E-5) into irb. It behaves the same in 2.0 and 1.9. I'm using Windows. Below is an irb session that demonstrates. Also included are JRuby and Python trials that show better behavior. This issue is not causing me any problems, but just in case someone there is interested in looking into it... Bob >ruby -v ruby 2.0.0p0 (2013-02-24) [i386-mingw32] >irb irb(main):001:0> RUBY_VERSION => "2.0.0" irb(main):002:0> -1.1505945E-5 => -1.1505945000000001e-05 >ruby19 -v ruby 1.9.3p392 (2013-02-22) [i386-mingw32] >irb19 irb(main):001:0> RUBY_VERSION => "1.9.3" irb(main):002:0> -1.1505945E-5 => -1.1505945000000001e-05 irb(main):002:0> >jirb irb(main):001:0> -1.1505945E-5 => -1.1505945e-05 >python Python 2.7.4rc1 (default, Mar 24 2013, 14:34:32) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> -1.1505945E-5 -1.1505945e-05 >>> repr(-1.1505945E-5) '-1.1505945e-05' -- http://bugs.ruby-lang.org/