Increase significant digits in Float

  • Thread starter Jason Lillywhite
  • Start date
J

Jason Lillywhite

If I want to increase my significant digits beyond 15 in a result of a
math expression involving floats, how do I do it? So, for example, I
would like more than 15 sig digits in the result of:

irb(main):001:0> 4.005 / 7
=> 0.572142857142857

Thank you!
 
J

Jesús Gabriel y Galán

If I want to increase my significant digits beyond 15 in a result of a
math expression involving floats, how do I do it? So, for example, I
would like more than 15 sig digits in the result of:

irb(main):001:0> 4.005 / 7
=> 0.572142857142857

irb is calling inspect on the value of the expression. It's the
inspect method the one that truncates to 15 digits when it creates the
string. You can create your own strings with greater precision like
this:

irb(main):001:0> result = 4.005 / 7
=> 0.572142857142857
irb(main):002:0> "%.20f" % result
=> "0.57214285714285717521"
irb(main):003:0> "%.30f" % result
=> "0.572142857142857175212213860505"

Check the String#% method:

http://ruby-doc.org/core/classes/String.html#M000770

and the Kernel#sprintf method:

http://ruby-doc.org/core/classes/Kernel.html#M005962

Jesus.
 
J

Jason Lillywhite

Jesús Gabriel y Galán said:
irb is calling inspect on the value of the expression. It's the
inspect method the one that truncates to 15 digits when it creates the
string.

Thank you! I forgot that IRB is returning a truncated string to the
screen.
 
S

Siep Korteling

Xavier said:
That 15 is hard-coded in the definition of Float#to_s.

Yes, and exposing more digits is not accurate:

puts "%.70f"%(4.005 / 7)
#=>0.5721428571428571752122138605045620352029800415039062500000000000000000
require 'bigdecimal'
a = BigDecimal.new("4.005")
b = a/7
puts b
#=>0.572142857142857142857143E0
p b.precs
#=>[24, 32]


#first number is the number of significant digits in b; the second
number is the maximum precision my system can handle (not sure about
this). The float is bogus after the 16th digit.

hth,

Siep
 
J

Jason Lillywhite

Siep said:
#first number is the number of significant digits in b; the second
number is the maximum precision my system can handle (not sure about
this). The float is bogus after the 16th digit.

Thank you Siep!

This is interesting - and good to know.
 
N

Neve Le

Siep said:
Yes, and exposing more digits is not accurate:
The float is bogus after the 16th digit.


Working with big numbers here, it seems that precision is only
guaranteed to 15 digits on either side of the decimal. When a whole
number >15 digits is divided the decimal is approximated, and anything
17 digits prints a float of n.0 no matter how it's "%n.nf" formatted.


Is the hard-coded 15 just a "safe" limit? Would I be able to recompile
ruby with a higher definition? If possible, how high could I go?
 
B

Brian Candler

Neve said:
Is the hard-coded 15 just a "safe" limit? Would I be able to recompile
ruby with a higher definition? If possible, how high could I go?

No, it's a limit of IEEE double-precision floating-point representation.

If you want more digits of precision, use BigDecimal.
 
B

brabuhr

J

Javier Goizueta

You may also want to take a look at http://flt.rubyforge.org/

It's an implementation of arbitrary precision floating point numbers
(decimal and binary). If you don't need it to be fast it has some
advantages over BigDecimal.
 
C

Colin Bartlett

[Note: parts of this message were removed to make it a legal post.]

You may also want to take a look at http://flt.rubyforge.org/

It's an implementation of arbitrary precision floating point numbers
(decimal and binary). If you don't need it to be fast it has some
advantages over BigDecimal.
Also: I recall a short thread from December 2008:
Proposing an arbitrary precision class building on BigDecimal and being
derived from Numeric
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/322100
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/322174 and
subsequent
or as a user friendly all in one place:
http://groups.google.com/group/comp...d/thread/66f505b9460464cc/e9a0142b118d66a8?q=
with links to:
https://rubyforge.org/projects/appmath/
http://appmath.rubyforge.org/
http://www.ulrichmutze.de/index.html

(I should observe that I haven't tried this code: I simply made a mental
note at the time of the thread that it might be useful.)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top