methods=Kernel/i.BigDecimal.bigdecimal
sublibraries=bigdecimal.jacobian,bigdecimal.newton,bigdecimal.ludcmp,bigdecimal.util,bigdecimal.math
requires=
classes=BigDecimal
is_sublibrary=false

bigdecimal ư黻饤֥Ǥ
Ǥդ٤ 10 ɽ줿ư򰷤ޤ

=== ¾ο֥ͥȤȤѴ (coerce)

BigDecimal ֥Ȥѱ黻ҤκˤȤϡ
BigDecimal ֥Ȥˤ륪֥Ȥ
(ɬפʤ) BigDecimal ѴƤ׻ޤ
äơBigDecimal ֥ȰʳǤ̣ͤΤʤ
֤б黻ϲǽǤ

ʸ (̾) ͤ˼ưѴ뤳ȤϤǤޤ
ʸͤ˼ưѴ bigfloat.c 
/* #define ENABLE_NUMERIC_STRING */פΥȤ򳰤Ƥ顢
ƥѥ롢ƥ󥹥ȡ뤹ɬפޤ
ʸǿͤͿդɬפǤ
ͤѴǤʤʸȡ
ñѴߤǥ顼ˤϤʤޤ
"10XX"ʤ 10"XXXX" 0 Ȱޤ

   a = BigDecimal.E(20)
   c = a * "0.123456789123456789123456789"   # ʸ BigDecimal ѴƤ׻

̵ɽʸȤơ
"Infinity""+Infinity""-Infinity""NaN" ѤǤޤ
(ʸʸ̤ޤ)
mode ᥽åɤ false ꤷ㳰ȯޤ
ޤBigDecimal饹 coerce(Rubyܻ)򥵥ݡȤƤޤ
äơBigDecimal ֥ȤˤפǤ
ߤ Ruby 󥿥ץ꥿λ;塢ʸ󤬺ˤȷ׻Ǥޤ

  a = BigDecimal.E(20)
  c = "0.123456789123456789123456789" * a   # 顼

ɬȤϻפޤ󤬡
ɤƤȸͤ String ֥ȤѾʥ饹Ƥ顢
Υ饹 coerce 򥵥ݡȤƤ

=== ̵¡ΰ

̵¡פȤɽǤʤ餤礭ʿǤ
̤˰ +Infinity (̵) 
-Infinity (̵) ɽޤ
̵¤ 1.0/0.0 Τ褦˥ǳ褦ʷ׻򤷤Ȥޤ

פ 0.0/0.0  Infinity-Infinity η̤Ǥʤ׻򤷤Ȥޤ NaN(Not a Number)ɽޤ NaN ޤ׻ NaN ˤʤޤޤ NaN ϼʬޤơɤʿȤפޤ

 +0.0  -0.0 ¸ߤޤ+0.0 == -0.0  true Ǥ

InfinityNaN +0.0  -0.0 ޤ׻̤Ȥ߹碌ˤʣǤ̣ΤͤϡʲΥץ¹ԤƷ̤ǧƤ(̤ˤĤơְ㤤ȯ줿ϤΤ餻ꤤޤ)

  require "bigdecimal"
  
  aa  = %w(1 -1 +0.0 -0.0 +Infinity -Infinity NaN)
  ba  = %w(1 -1 +0.0 -0.0 +Infinity -Infinity NaN)
  opa = %w(+ - * / <=> > >=  < == != <=)
  
  for a in aa
    for b in ba
      for op in opa
        x = BigDecimal::new(a)
        y = BigDecimal::new(b)
        eval("ans= x #{op} y;print a,' ',op,' ',b,' ==> ',ans.to_s,\"\n\"")
      end
    end
  end

=== ¤

BigDecimalưϹ¤(Real)ɽޤ
Τ unsigned long  (ʲι¤ frac) Ǵޤ
ǰŪˤϡʲΤ褦ˤʤޤ

  <ư> = 0.xxxxxxxxx * BASE ** n

ǡx ϲɽBASE ϴ (10 ɽʤ 10)
n ϻؿɽͤǤBASE礭ۤɡ礭ʿͤɽǤޤ
ĤޤꡢΥ򾯤ʤǤޤ
BASE 礭ۤԹ礬褤櫓ǤǥХåΤ䤹ʤɤθơ
10000ˤʤäƤޤ (BASE  VpInit() ؿǼưŪ˷׻ޤ)
 32 ӥåξǤ64ӥåξϤä礭ͤˤʤޤ
ǰʤ顢64 ӥåǤΥƥȤϤޤäƤޤ
⤷ƥȤ򤷤з̤򶵤Ƥ
BASE  10000 ΤȤϡʲβ (frac) γǤˤϺ 4 οǼޤ

ư¤ (Real) ϰʲΤ褦ˤʤäƤޤ

  typedef struct {
     unsigned long MaxPrec; // (frac[]󥵥)
     unsigned long Prec;    // (frac[]λѥ)
     short    sign;         // ʲΤ褦ξ֤ޤ
                            //  ==0 : NaN
                            //    1 : +0
                            //   -1 : -0
                            //    2 : 
                            //   -2 : 
                            //    3 : +Infinity
                            //   -3 : -Infinity
     unsigned short flag;   // Ƽեå
     int      exponent;     // ؿ(*BASE**exponent)
     unsigned long frac[1]; // ()
  } Real;

㤨 BASE=10000 ΤȤ 1234.56784321 Ȥϡ

    0.1234 5678 4321*(10000)**1

Ǥ frac[0] = 1234frac[1] = 5678frac[2] = 4321
Prec = 3sign = 2exponent = 1 Ȥʤޤ
MaxPrec  Prec 礭ФĤǤ⤫ޤޤ
flag λˡϼ˰¸ǻѤޤ

=== 2 ʤ 10 

BigDecimal  <ư> = 0.xxxxxxxxx*10**n Ȥ 10 ʷǿͤݻޤ
׻ưɽϡ
ޤǤʤ <ư> = 0.bbbbbbbb*2**n Ȥ 2 ʷ̤Ǥ
(x  0  9 ޤǡb  0  1 ο)
BigDecimal ʤ 10 ʤɽѤΤʲޤ

=== 10 ʤΥå

==== ǥХåΤ䤹

ޤץڤǤ
frac[0]=1234frac[1]=5678frac[2]=4321 exponent=1sign=2
ʤͤ 1234.56784321 ǤΤϸФʬޤ 

==== 10ɽ줿ͤʤμ¤ɽѴǤ

㤨СʲΤ褦ʥץ̵Ƿ׻뤳ȤǤޤ
ʲϡԤ˰Ĥοͤ񤤤Ƥե file ι׿ͤΤǤ

   file = File::open(....,"r")
   s = BigDecimal::new("0")
   while line = file.gets
      s = s + line
   end

 2 ʿǷ׻ȸǽޤ
㤨 0.1 2ʤɽ
0.1 = b1*2**(-1)+b1*2**(-2)+b3*2**(-3)+b4*2**(-4) ġ
̵¤³Ƥޤޤ (b1=0,b2=0,b3=0,b4=1...)
 bn(n=1,2,3,...)  2ʤɽ 0  1 οǤ
äơɤǤڤɬפޤѴޤ
󡢤 10 ɽˤư褦ʾ
Ŭڤʴݤ(ͼθ)ˤäƺƤ "0.1" ɽޤ
ǤΤ 0.1 ǤϤޤ 

==== ͭͭ¤Ǥ (Ĥޤ꼫ưǤ)

0.1 ɽ뤿ΰϤäĤ (frac[0] = 1) ǺѤߤޤ
Ǥο10ʿͤ鼫ưŪ˷Ǥޤ
ϡĹư黻ǤʤȤǤ
դ 0.1  2 ɽȤ 2 ʤͭ򤤤ĤˤΤϡ
0.1 ȤͤϷǤޤ 

=== 10 ʤΥǥå

¤ϺޤǤΥåȤϡΤޤޥǥåȤˤʤޤ
⤽⡢10 ʤ 2 ʤѴ褦
Ѵȼ򤹤뤳ȤϤǤޤ
糵Υԥ塼 10 ʤɽäƤʤΤǡ
BigDecimal ѤƸ̵η׻򤹤ϡ
׻®٤̵뤷ƤǸޤ BigDecimal ³ɬפޤ

==== ǽϲ

ʬǷ׻Ȥˤ虜虜 2 ʿȤͤ϶ˤƤޤǤ
׻˥ǡϤȤۤȤɤξ硢 10ʿϤޤ
η̡double η׻ɽϺǽ餫äƤ礬ޤ
BigDecimal ϥ桼Ϥ̵ǼळȤǤޤ
ǥХåΤ䤹ȡǡɤߤ߻˸ʤȤ 2 ºݤΥåȤǤ

==== ׻٤ˤĤ

c = a op b Ȥ׻ (op  + - * /) 򤷤ȤưϰʲΤ褦ˤʤޤ

  (1) 軻 (a ͭ) + (b ͭ)
       (a κͭ) + (b κͭ) ʬκ
      (ºݤϡ;͵äơ⤦礭ʤޤ) ѿ c 򿷤ޤ
      øξϡФʤ٤ c ޤ
      㤨 c = 0.1+0.1*10**(-100) Τ褦ʾ硢c ٤100ʾ٤Ĥ褦ˤʤޤ
  (2)  c = a op b η׻¹Ԥޤ

Τ褦ˡøȾ軻Ǥ c ɬָФʤפ٤äޤ
(BigDecimal.limit ꤷʤ)
 (a κͭ) + (b κͭ) ʬκ c ޤ
c = 1.0/3.0 Τ褦ʷ׻餫ʤ褦ˡ
c κ٤ĶȤǷ׻Ǥڤ礬ޤ

ˤ衢c κ٤ a  b 礭ʤޤΤ
c ɬפȤ꡼ΰ礭ʤ뤳ȤդƲ

ա+, -, *, /פǤϷ̤(ͭ)ʬǻǤޤ
٤򥳥ȥ뤷ϡʲΥ󥹥󥹥᥽åɤѤޤ

: add, sub, mult, div

  Υ᥽åɤƬ (Ǻ) οηǤޤ

    BigDecimal("2").div(3,12) # 2.0/3.0 => 0.6666666666 67E0

: truncate, round, ceil, floor

  Υ᥽åɤϾа֤ꤷƷꤷޤ

    BigDecimal("6.66666666666666").round(12) # => 0.6666666666 667E1

==== ʬ٤򥳥ȥ뤷

ʬ(ͭ)򥳥ȥ뤷 addsubmultdiv Υ᥽åɤѤǤޤʲα߼Ψ׻ץΤ褦ˡϼʬǻꤹ뤳ȤǤޤ

  #!/usr/local/bin/ruby
  
  require "bigdecimal"
  #
  # Calculates 3.1415.... (the number of times that a circle's diameter
  # will fit around the circle) using J. Machin's formula.
  #
  def big_pi(sig) # sig: Number of significant figures
    exp    = -sig
    pi     = BigDecimal::new("0")
    two    = BigDecimal::new("2")
    m25    = BigDecimal::new("-0.04")
    m57121 = BigDecimal::new("-57121")
  
    u = BigDecimal::new("1")
    k = BigDecimal::new("1")
    w = BigDecimal::new("1")
    t = BigDecimal::new("-80")
    while (u.nonzero? && u.exponent >= exp) 
      t   = t*m25
      u   = t.div(k,sig)
      pi  = pi + u
      k   = k+two
    end
  
    u = BigDecimal::new("1")
    k = BigDecimal::new("1")
    w = BigDecimal::new("1")
    t = BigDecimal::new("956")
    while (u.nonzero? && u.exponent >= exp )
      t   = t.div(m57121,sig)
      u   = t.div(k,sig)
      pi  = pi + u
      k   = k+two
    end
    pi
  end
  
  if $0 == __FILE__
    if ARGV.size == 1
      print "PI("+ARGV[0]+"):\n"
      p big_pi(ARGV[0].to_i)
    else
      print "TRY: ruby pi.rb 1000 \n"
    end
  end





BigDecimal ϲĹư׻ǽ饤֥Ǥ


=== Ϥ

ͭפȤ BigDecimal ٤ݾڤǤԤäǤϤޤ
㴳;͵äƷ׻ޤޤ㤨32ӥåȤΥƥǤ10ʤ4˷׻ޤ
äơǤϡΡͭפ4ܿȤʤäƤޤ

ʲΥ᥽åɰʳˤ⡢(C ǤϤʤ) Ruby η󶡤ƤΤ⤢ޤ㤨С

  require "bigdecimal/math.rb"

Ȥ뤳Ȥǡsin  cos ȤäؿѤǤ褦ˤʤޤ
ˡʤɡܺ٤ [[lib:bigdecimal/math]] 򻲾ȤƲ ¾Float ȤѴʤɤ
᥽åɤ [[lib:bigdecimal/util]] ǥݡȤƤޤѤˤ

  require "bigdecimal/util.rb"

Τ褦ˤޤܺ٤ [[lib:bigdecimal/util]] 򻲾ȤƲ

=== 

  require 'bigdecimal'
  a = BigDecimal::new("0.123456789123456789")
  b = BigDecimal("123456.78912345678",40)
  c = a + b
