зеркало из https://github.com/github/ruby.git
* 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
This commit is contained in:
Родитель
b3c7867df7
Коммит
c383fbf93f
|
@ -1,3 +1,12 @@
|
||||||
|
Tue Nov 9 10:44:19 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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/
|
||||||
|
|
||||||
Tue Nov 9 07:30:15 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Tue Nov 9 07:30:15 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* error.c (rb_syserr_new): new function to make SystemCallError
|
* error.c (rb_syserr_new): new function to make SystemCallError
|
||||||
|
|
|
@ -190,6 +190,8 @@ class TestSprintf < Test::Unit::TestCase
|
||||||
sprintf("%20.0f", 36893488147419107329.0))
|
sprintf("%20.0f", 36893488147419107329.0))
|
||||||
assert_equal(" Inf", sprintf("% 0e", 1.0/0.0), "moved from btest/knownbug")
|
assert_equal(" Inf", sprintf("% 0e", 1.0/0.0), "moved from btest/knownbug")
|
||||||
assert_equal(" -0.", sprintf("%#10.0f", -0.5), "[ruby-dev:42552]")
|
assert_equal(" -0.", sprintf("%#10.0f", -0.5), "[ruby-dev:42552]")
|
||||||
|
assert_equal("0x1.p+2", sprintf('%.0a', Float('0x1.fp+1')), "[ruby-dev:42551]")
|
||||||
|
assert_equal("-0x1.0p+2", sprintf('%.0a', Float('-0x1.ffp+1')), "[ruby-dev:42551]")
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_float_hex
|
def test_float_hex
|
||||||
|
|
7
util.c
7
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. */
|
/* Round to the desired number of digits. */
|
||||||
if (SIGFIGS > ndigits && ndigits > 0) {
|
if (SIGFIGS > ndigits && ndigits > 0) {
|
||||||
float redux = 1.0f;
|
float redux = 1.0f;
|
||||||
|
volatile double d;
|
||||||
int offset = 4 * ndigits + DBL_MAX_EXP - 4 - DBL_MANT_DIG;
|
int offset = 4 * ndigits + DBL_MAX_EXP - 4 - DBL_MANT_DIG;
|
||||||
dexp_set(u, offset);
|
dexp_set(u, offset);
|
||||||
u.d += redux;
|
d = u.d;
|
||||||
u.d -= redux;
|
d += redux;
|
||||||
|
d -= redux;
|
||||||
|
u.d = d;
|
||||||
*decpt += dexp_get(u) - offset;
|
*decpt += dexp_get(u) - offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче