From c383fbf93f691f443eb16761351a6943bc29d3f9 Mon Sep 17 00:00:00 2001 From: naruse Date: Tue, 9 Nov 2010 01:57:49 +0000 Subject: * util.c (ruby_strtod): this code uses FPU's rounding system. But x86's FPU calculates double precision floating-point numbers in 80bit precision, so it fails to round the value. So ensure the value is assigned a variable. [ruby-dev:42551] see also [ruby-math:00802] http://www.shudo.net/java-grandprix99/strictfp/ git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29729 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- util.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index 0b69b6cfb7..bc307e4636 100644 --- a/util.c +++ b/util.c @@ -4014,10 +4014,13 @@ ruby_hdtoa(double d, const char *xdigs, int ndigits, int *decpt, int *sign, /* Round to the desired number of digits. */ if (SIGFIGS > ndigits && ndigits > 0) { float redux = 1.0f; + volatile double d; int offset = 4 * ndigits + DBL_MAX_EXP - 4 - DBL_MANT_DIG; dexp_set(u, offset); - u.d += redux; - u.d -= redux; + d = u.d; + d += redux; + d -= redux; + u.d = d; *decpt += dexp_get(u) - offset; } -- cgit v1.2.3