Issue #8299 has been updated by naruse (Yui NARUSE).

Category set to platform/mingw
Status changed from Open to Assigned
Assignee set to nobu (Nobuyoshi Nakada)

phasis68 (Heesob Park) wrote:
> 2013/4/25 naruse (Yui NARUSE) <naruse / airemix.jp>:
>  >
>  > Issue #8299 has been updated by naruse (Yui NARUSE).
>  >
>  >
>  > phasis68 (Heesob Park) wrote:
>  >> 2013/4/25 naruse (Yui NARUSE) <naruse / airemix.jp>:
>  >>  >
>  >>  > Issue #8299 has been updated by naruse (Yui NARUSE).
>  >>  >
>  >>  >
>  >>  > phasis68 (Heesob Park) wrote:
>  >>  >> 2013/4/25 naruse (Yui NARUSE) <naruse / airemix.jp>:
>  >>  >>  > Therefore use SSE2 rather than such workaround.
>  >>  >>
>  >>  >>  I'm not sure why you think SSE2 can fix this issue.
>  >>  >>
>  >>  >>  The ruby_strtod function used in converting string value to double
>  >>  >>  value requires double-precision (53-bit) rounding precision but
>  >>  >>  mingw32 gcc 4.5.2 have default 64-bit precision which higher than
>  >>  >>  other compilers.
>  >>  >>
>  >>  >>  So the patch lowers precision from 64 bit to 53 bit.
>  >>  >
>  >>  > double arithmetics with SSE2 is double-precision.
>  >>  > see also gcc's -mfpmath=sse option
>  >>  > http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/i386-and-x86_002d64-Options.html#index-march-959
>  >>
>  >>  I agree that SSE2 is the better solution for modern OS and modern compiler.
>  >>
>  >>  But SSE2 has more restrictions than x87.
>  >>  SSE2 is not supported on the following environment.
>  >>     Microsoft Visual C++ Compiler prior to Visual Studio .NET 2003.
>  >
>  > Use newer compiler.
>  The requirement in win32/README.win32 need to be modified.

There's already "strongly recommended VC++ 10 or later".
Note that VC++2003 or later has /fp:precise and it is default

>  >
>  >>     AMD CPUs prior to Athlon 64, including all Socket A-based CPUs
>  >>     Intel CPUs prior to Pentium 4
>  >
>  > Use -mfpmath=sse,387.
>  > As I wrote before, if you want to get the same result with x87 FPU _control87(_PC_53, _MCW_PC) is not sufficient.
>  > It needs to handle 15 bit exponent.
>  
>  I don't want the same result with SSE2 and  x87 FPU.
>  The 15 bit exponent is not a matter of this issue.
>  The point is that ruby_strtod function requires 53-bit precision and
>  mingw32 4.5.2 compiler is 64-bit precision unlike other windows
>  compiler which is 53-bit precision.
>  I confirmed that _control87(_PC_53, _MCW_PC) patch works fine with
>  ruby 1.9.3 mingw32 gcc 4.5.2 version.

Your patch changes global state.
Change global or apply it to ruby_strtod is up to nobu, the mingw port maintainer.

>  > If you want to do that, it is as hard as implementing strictfp of Java on x87.
>  > see also http://math.nist.gov/javanumerics/reports/jgfnwg-01.html
>  > http://www.shudo.net/java-grandprix99/strictfp/#JGNWG98-2 (Japanese)
>  
>  You've gone too far from this issue.
>  The issuer wants the correct value of strtod function on the ruby
>  1.9.3 mingw32 version.
>  My patch is for mingw32 gcc compiler only.

Hmm, up to nobu.
----------------------------------------
Bug #8299: Minor error in float parsing
https://bugs.ruby-lang.org/issues/8299#change-38915

Author: bobjalex (Bob Alexander)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: platform/mingw
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/