nobu.nokada / softhome.net wrote in message news:<200304161751.h3GHpIHQ017185 / sharui.nakada.kanuma.tochigi.jp>...
> Hi,
>
> What about just adding an extra digit than DBL_DIG?
> 
> Yet another idea is to use original binary format: divide the
> value into sign, exponent and mantissa, then encode them
> severally.
>
[ patch follows ]

The DBL_DIG patch makes the problem less common, but does not solve it;

[[1,2,3,4], [81, 2, 118, 3146]].each { |w,x,y,z|
a = (x.to_f + y.to_f / z.to_f) * Math.exp(w.to_f / (x.to_f + y.to_f / z.to_f))
ma = Marshal.dump(a)
b = Marshal.load(ma)
if a == b
  puts "Everything is working fine for #{a}"
else
  puts "PROBLEM: a is #{a}, b is #{b}, and ma is #{ma.dump}"
end
}

Produces

Everything is working fine for 3.95601527633861
PROBLEM: a is 3.7517675036461267e+17, b is 3.7517675036461261e+17, 
and ma is "\004\010f\e3.7517675036461267e+17"

The problem remains that certain numbers that are 
exactly representable in binary are not exactly 
representable in decimal without more precise rounding
rules than sprintf gives us.  I think that your other 
suggestion about dividing into sign, mantissa, and 
exponent would work, but I am not sure I see the 
advantage, as it seems it would be more complex and 
perhaps larger than just saving the least significant 
few bits of the mantissa.