Project

General

Profile

Actions

Bug #3365

closed

floats revisited (see bug 1841)

Added by blue_anna (Roberto Tomás Collins McCarthy) almost 14 years ago. Updated almost 13 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.1p378 (2010-01-10 revision 26273) [powerpc-linux]
Backport:
[ruby-core:30513]

Description

=begin
someone posted that the float errors were just fine by them, referring to IEEE 754. I suggest visiting that standard yourself before closing the bug. If you look at the bug as reported, there is a rounding error on the 16th digit. IEEE 754 provides precision through 16 digits on doubles (binary64), the first rounding (eg, error) can only occur at the 17th digit.

I can confirm on my system that C does not produce the same results as ruby in this regard:
bash$ gcc -o fp fp.c && ./fp && ruby -e 'puts "\nfp.c\n······\n"' && cat fp.c && ruby -e 'puts "\nruby #{RUBY_VERSION}: #{100.0 - 91.6}"'
System double representaiton: 8.400000e+00
8.40000000000000568434188608080148696899414062500000e+00
8.40000000000000568434188608080148696899414062500000e+00
sizeof doubles 8
sizeof long doubles 16

fp.c
······
#include <stdio.h>
#include <math.h>

int main(){
double cien = 100.0;
double frac = 91.6;
long double ciento = 100.0;
long double fract = 91.6;
printf("System double representaiton: %e\n", cien - frac);
printf("%.50e\n", cien - frac);
printf("%.50Le\n", ciento - fract);

printf("sizeof doubles %d\n", sizeof(cien));
printf("sizeof long doubles %d\n", sizeof(ciento));
return 0;
}
ruby 1.9.1: 8.40000000000001

independently of whether ruby would or would not conform to IEEE754 the fact that C does not see doubles the same as ruby can be seen as a bug. as can the fact that right now elementary math any 2nd grader could expect to use with ruby can fail (100.0 - 91.6 == 8.4).
=end


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #1841: Float internal problem in ruby1.9.2dev (2009-07-18)Rejected07/30/2009Actions
Actions #1

Updated by naruse (Yui NARUSE) almost 14 years ago

  • Status changed from Open to Rejected

=begin
Try following.

~/local/ruby_1_9_1/bin/irb
irb(main):001:0> n=8.40000000000000568434188608080148696899414062500000e+00
=> 8.40000000000001
irb(main):002:0> '%.99g' % n
=> "8.400000000000005684341886080801486968994140625"
=end

Actions #2

Updated by blue_anna (Roberto Tomás Collins McCarthy) almost 14 years ago

=begin
I'm confused. how does that match either of: the system's own handling of doubles (which the ruby api docs say it uses) or the IEEE754 specification (which would require to have a minum of 1 more zero in the tail)

quote from http://en.wikipedia.org/wiki/IEEE_754-2008:
Correctly rounded results can be obtained by converting to decimal and back again to the binary format using:

 5 decimal digits for binary16
 9 decimal digits for binary32
 17 decimal digits for binary64
 36 decimal digits for binary128 

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0