Actions
Bug #13545
closedRuby built by clang 4.0.0 parses Float literal wrongly
Description
$ ./configure --prefix=/home/mame/work/local CC=clang
$ make -j 4 miniruby
$ ./miniruby -e 'p 1.1851510441583988e+30'
1.1851510441583981e+30
See the last digit. While the original literal ends with "8e+30", the result ends with "1e+30". The version of clang is 4.0.0-1ubuntu1.
There seems to be a bug in ruby_strtod
. It manipulates a double variable as an integer variable by using cast. I think that this is undefined behavior, and clang seems to optimize some operations out.
We can fix this issue by adding volatile
to its variable declaration, but I'm unsure if this is a good solution.
diff --git a/util.c b/util.c
index 4ae7c4fc96..ecd55bb0c5 100644
--- a/util.c
+++ b/util.c
@@ -1832,7 +1832,7 @@ d2b(double d_, int *e, int *bits)
static double
ratio(Bigint *a, Bigint *b)
{
- double_u da, db;
+ volatile double_u da, db;
int k, ka, kb;
dval(da) = b2d(a, &ka);
Updated by naruse (Yui NARUSE) almost 7 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r58796.
Merge latest dtoa.c [Bug #13545]
Apply some part of http://www.netlib.org/fp/dtoa.c with my eyes...
Updated by naruse (Yui NARUSE) almost 7 years ago
- Backport changed from 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED
Updated by usa (Usaku NAKAMURA) almost 7 years ago
- Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: DONE, 2.4: REQUIRED
ruby_2_3 r59224 merged revision(s) 58796.
Updated by nagachika (Tomoyuki Chikanaga) almost 7 years ago
- Backport changed from 2.2: REQUIRED, 2.3: DONE, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE
ruby_2_4 r59298 merged revision(s) 58796.
Actions
Like0
Like0Like0Like0Like0