<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
<style type="text/css"><!--
body {
  color: #3f0f0f;
  background: #fefeff;
  margin-left: 2em; margin-right: 2em;
}
h1 {
  color: #ffffff;
  background-color: #3939AD;
  border-color: #FF00FF;
  width: 100%;
  border-style: solid;
  border-top-width: 0.1em;
  border-bottom-width: 0.1em;
  border-right: none;
  border-left: none;
  padding: 0.1em;
  font-weight: bold;
  font-size: 160%;
  text-align: center;
}
h2 {
  color: #00007f;
  background-color: #e7e7ff;
  border-color: #000094;
  width: 100%;
  border-style: solid;
  border-left: none;
  border-right: none;
  border-top-width: 0.1em;
  border-bottom-width: 0.1em;
  padding: 0.1em;
  font-weight: bold;
  font-size: 110%;
}
h3 {
  color: #00007f;
  padding: 0.2em;
  font-size: 110%;
}
h4, h5 {
  color: #000000;
  padding: 0.2em;
  font-size: 100%;
}
table {
  margin-top: 0.2em; margin-bottom: 0.2em;
  margin-left: 2em; margin-right: 2em;
}
caption {
  color: #7f0000;
  font-weight: bold;
}
th {
  background: #e7e7ff;
  padding-left: 0.2em; padding-right: 0.2em;
}
td {
  background: #f3f7ff;
  padding-left: 0.2em; padding-right: 0.2em;
}
code {
  color: #0000df;
}
dt {
  margin-top: 0.2em;
}
li {
  margin-top: 0.2em;
}
pre
{
    BACKGROUND-COLOR: #d0d0d0;
    BORDER-BOTTOM: medium none;
    BORDER-LEFT: medium none;
    BORDER-RIGHT: medium none;
    BORDER-TOP: medium none;
    LINE-HEIGHT: 100%;
    MARGIN: 12px 12px 12px 12px;
    PADDING-BOTTOM: 12px;
    PADDING-LEFT: 12px;
    PADDING-RIGHT: 12px;
    PADDING-TOP: 12px;
    WHITE-SPACE: pre;
    WIDTH: 100%
}
--></style>

<TITLE>BigDecimal:An extension library for Ruby</TITLE>
</HEAD>
<BODY BGCOLOR=#FFFFE0>
<H1>BigDecimal(�•ϒ����������_���Z�p�g�����C�u����)</H1>
<DIV align="right"><A HREF="./bigdecimal_en.html">English</A></DIV><BR>
BigDecimal �̓I�u�W�F�N�g�w���̋��͂ȃX�N���v�g����ł��� Ruby �ɉ•ϒ����������_
�v�Z�@�\��lj����邽�߂̊g�����C�u�����ł��B
Ruby �ɂ‚��Ă̏ڂ������e�͈ȉ���URL���Q�Ƃ��Ă��������B
<UL>
<LI><A HREF="http://www.ruby-lang.org/ja/">http://www.ruby-lang.org/ja/</A>�FRuby�����y�[�W</LI>
<LI><A HREF="http://ruby.freak.ne.jp/">http://ruby.freak.ne.jp/</A>�FRuby�Ɋւ�����y�[�W</LI>
<LI><A HREF="http://kahori.com/ruby/ring/">http://kahori.com/ruby/ring/</A>�FRuby�Ɋւ���y�[�W��H��܂�</LI>
</UL> 
<hr>
<H2>�ڎ�</H2>
<UL>
<LI><A HREF="#INTRO">�͂��߂�</LI>
<LI><A HREF="#SPEC">�g�p���@�ƃ��\�b�h�̈ꗗ</A></LI>
<LI><A HREF="#UNDEF">�����A�񐔁A�[���̈���</A></LI>
<LI><A HREF="#STRUCT">�����\��</A></LI>
<LI><A HREF="#BASE">2�i��10�i</A></LI>
<LI><A HREF="#PREC">�v�Z���x�ɂ‚���</A></LI>
</UL>

<HR>
<A NAME="#INTRO">
<H2>�͂��߂�</H2>
Ruby �ɂ� Bignum �Ƃ����N���X������A���S���̐����ł��v�Z���邱�Ƃ��ł��܂��B
�����A�C�ӌ��̕��������_���Z�p�N���X�������悤�ł��B�����ŁA
�C�ӌ��̕��������_���Z�p�g�����C�u���� BigDecimal ���쐬���܂����B
�s��⏕���E��Ă�����ꍇ�ǂ��ǂ��A
<A HREF="mailto:shigeo@tinyforest.gr.jp">shigeo@tinyforest.gr.jp</A>
�܂ł��m�点���������B�s��𒼂��C�͑傢�ɂ���܂��B�����A���ԂȂǂ̊֌W�Ŗ�
�͂ł��܂���B�܂��A���ʂɂ‚��Ă��ۏ؂ł�����̂ł͂���܂���B
�\�߁A���������������B
<BR><BR>
���̃v���O�����́A���R�ɔz�z�E���ς��č\���܂���B�������A���쌠�͕������Ă��܂���B
�z�z�E���ϓ��̌����� Ruby �̂���ɏ����܂��B�ڂ����� README ��ǂ�ł��������B

<hr>
<H2>�C���X�g�[���ɂ‚���</H2>
BigDecimal ���܂� Ruby �̍ŐV�ł�<A HREF="http://www.ruby-lang.org/ja/">Ruby�����y�[�W</A>����_�E�����[�h�ł��܂��B
�_�E�����[�h�����ŐV�ł��𓀂�����A�ʏ�̃C���X�g�[���菇�����s���ĉ������B
Ruby ���������C���X�g�[�������΁A������ BigDecimal �����p�ł���悤�ɂȂ�͂��ł��B
�\�[�X�t�@�C���� 
bigdecimal.c,bigdecimal.h 
�̂Q�‚݂̂ł��B<BR>

<hr>
<A NAME="#SPEC">
<H2>�g�p���@�ƃ��\�b�h�̈ꗗ</H2>
�uRuby�͊��ɏ�����v�Ƃ����O��ŁA<br><br>
<CODE>
<PRE>
require 'bigdecimal'
a=BigDecimal::new("0.123456789123456789")
b=BigDecimal::new("123456.78912345678",40)
c=a+b
</PRE>
</CODE>
<br>
�Ƃ����悤�Ȋ����Ŏg�p���܂��B

<H3>���\�b�h�ꗗ</H3>
�ȉ��̂悤�ȃ��\�b�h�����p�”\�ł��B<BR>
�L�q��ABigDecimal �I�u�W�F�N�g�� a,b,c,r�ŁAString�i������j�I�u�W�F�N�g��
 s�A������ n �ŕ\�L���܂��B�܂��A�u�L�������v�Ƃ� BigDecimal �����x��ۏ؂���
�����ł��B�҂�����ł͂���܂���A�኱�̗]�T�������Čv�Z����܂��B�܂��A
�Ⴆ�΂R�Q�r�b�g�̃V�X�e���ł͂P�O�i�łS�����Ɍv�Z���܂��B�]���āA����ł́A
�����́u�L�������v�͂S�̔{���ƂȂ��Ă��܂��B

<UL>
<LI>new</LI><BR>
�V���� BigDecimal �I�u�W�F�N�g�𐶐����܂��B<BR>
a=BigDecimal::new(s[,n])<BR>
s �͏����l�𕶎���Ŏw�肵�܂��D
n �͕K�v�ȗL�������ia �̍ő�L�������j�𐮐��Ŏw�肵�܂��B
n �� 0 �܂��͏ȗ����ꂽ�Ƃ��́An �̒l�� s �̗L�������Ƃ݂Ȃ���܂��B
s �̗L��������� n ���������Ƃ��� n=0 �̂Ƃ��Ɠ����ł��B
a �̍ő�L�������� n ���኱�傢�l���̗p����܂��B
<LI>+</LI><BR>
���Z�ic = a + b�j<BR>
c �̐��x�ɂ‚��Ắu<A HREF="#PREC">�v�Z���x�ɂ‚���</A>�v���Q�Ƃ��Ă��������B
<LI>-</LI><BR>
���Z�ic = a - b�j�A�܂��͕������]�ic = -a�j<BR>
c �̐��x�ɂ‚��Ắu<A HREF="#PREC">�v�Z���x�ɂ‚���</A>�v���Q�Ƃ��Ă��������B
<LI>*</LI><BR>
��Z(c = a * b)<BR>
c�̐��x��(a�̐��x)+(b�̐��x)���x�ł��B<br>
�ڂ����́u<A HREF="#PREC">�v�Z���x�ɂ‚���</A>�v���Q�Ƃ��Ă��������B

<LI>/</LI><BR>
���Z(c = a / b)<BR>
c �̐��x�ɂ‚��Ắu<A HREF="#PREC">�v�Z���x�ɂ‚���</A>�v���Q�Ƃ��Ă��������B

<LI>assign</LI><BR>
�ȉ��̂悤�Ɏg�p���܂��B<BR>
c = a.assign(n,f)<BR>
f > 0 �Ȃ�Aa �� c �ɁA���̂܂ܑ�����܂��B
f < 0 �Ȃ�A-a �� c �ɑ�����܂��B
f �̐�Βl�i|f|�j�͂P���Q���w�肵�Ă��������B
|f|=2 �̂Ƃ��́Ac �̍ő吸�x�� a �̎����x��菬�����Ƃ��ɂ�
�ۂ߂��܂��B|f|=1 �̂Ƃ��͐؂�̂Ă��܂��B
n �� c �̗L�������ł��in ���ȏ�̐��x������ c ����������܂��j�B

<LI>add</LI><BR>
�ȉ��̂悤�Ɏg�p���܂��B<BR>
c = a.add(b,n)<BR>
c = a + b ���ő�� n ���܂Ōv�Z���܂��B
a + b �̐��x�� n ���傫���Ƃ��͊ۂ߂��܂��B

<LI>sub</LI><BR>
�ȉ��̂悤�Ɏg�p���܂��B<BR>
c = a.sub(b,n)<BR>
c = a - b ���ő�� n ���܂Ōv�Z���܂��B
a - b �̐��x�� n ���傫���Ƃ��͊ۂ߂��܂��B

<LI>mult</LI><BR>
�ȉ��̂悤�Ɏg�p���܂��B<BR>
c = a.mult(b,n)<BR>
c = a * b ���ő�� n ���܂Ōv�Z���܂��B
a * b �̐��x�� n ���傫���Ƃ��͊ۂ߂��܂��B

<LI>div</LI><BR>
�ȉ��̂悤�Ɏg�p���܂��B<BR>
c,r = a.div(b,n)<BR>
c=a/b �̌v�Z�����܂��B r �ɂ͏�]���������܂��Ba/b��
�K�v�Ȃ�n ���܂Ōv�Z����܂��Bdivmod ���\�b�h
�ƈقȂ�Ac �͐����Ƃ͌���܂���B
�܂��A c �͊ۂ߂��邱�Ƃ͂���܂���B
 a = c*b + r �̊֌W�͐������܂��B
<LI>%</LI><BR>
r = a%b <BR>
a/b �̗]����v�Z���܂��B�ȉ��̌v�Z�Ɠ������̂ł��B<BR>
r = a-((a/b).floor)*b<BR>
<LI>fix</LI><BR>
a �̏����_�ȉ��̐؂�̂āB<BR>
c = a.fix
<LI>frac</LI><BR>
a �̐��������̐؂�̂āB<BR>
c = a.frac
<LI>floor</LI><BR>
a �ȉ��̍ő吮����\���l�iBigDecimal �l�j��Ԃ��܂��B<BR>
c = a.floor<BR>
�ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂�
(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR>
c = BigDecimal("1.23456")<BR>
d = c.floor(4) # d = 1.2345 �ɂȂ�܂��B<BR>
 n �����̂Ƃ��͏����_�ȏ� n ���ڂ𑀍삵�܂��B<BR>
c = BigDecimal("15.23456")<BR>
d = c.floor(-1) # d = 10.0 �ɂȂ�܂��B<BR>

<LI>ceil</LI><BR>
a �ȏ�̐����̂����A�ł��������������v�Z���A���̒l�iBigDecimal �l�j��Ԃ��܂��B<BR>
c = a.ceil<BR>
�ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂�
(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR>
c = BigDecimal::new("1.23456")<BR>
d = c.ceil(4) # d = 1.2346 �ɂȂ�܂��B<BR>
 n �����̂Ƃ��͏����_�ȏ� n ���ڂ��𑀍삵�܂��B<BR>
c = BigDecimal::new("15.23456")<BR>
d = c.ceil(-1) # d = 20.0 �ɂȂ�܂��B<BR>

<LI>round</LI><BR>
�����_�ȉ����ʂ̐����l�̌ܓ����Đ����iBigDecimal �l�j�ɂ��܂��B<BR>
c = a.round<BR>
�ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂�
(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR>
n �����̎��́A�����_�ȉ� n+1 �ʂ̐������l�̌ܓ����܂��B
c = BigDecimal::new("1.23456")<BR>
d = c.round(4)  # d = 1.235 �ɂȂ�܂��B<BR>
 n �����̂Ƃ��͏����_�ȏ� n ���ڂ��𑀍삵�܂��B<BR>
c = BigDecimal::new("15.23456")<BR>
d = c.round(-1) # d = 20.0 �ɂȂ�܂��B<BR>

<LI>truncate</LI><BR>
�����_�ȉ��̐���؂�̂ĂĐ����iBigDecimal �l�j�ɂ��܂��B<BR>
c = a.truncate<BR>
�ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂�
(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR>
n �����̎��́A�����_�ȉ� n+1 �ʂ̐�����؂�̂Ă܂��B
c = BigDecimal::new("1.23456")<BR>
d = c.truncate(4)  # d = 1.2345 �ɂȂ�܂��B<BR>
 n �����̂Ƃ��͏����_�ȏ� n ���ڂ��𑀍삵�܂��B<BR>
c = BigDecimal::new("15.23456")<BR>
d = c.truncate(-1) # d = 10.0 �ɂȂ�܂��B<BR>

<LI>divmod</LI><BR>
���Ə�]�̔z���Ԃ��܂��B<BR>
c,r = a.divmod(b) # a = c*b + r<BR>
divmod���\�b�h�� a = c * b + r �ƂȂ� a / b �̕��������_�^�̏� c �Ə�] r ��
�v�Z���܂��B������ c �͐����i���������̂Ȃ������j�ɂȂ�܂��B<BR>
c = (a/b).floor <BR>
r = a - c*b<BR>
�Ōv�Z����܂��B
<LI>remainder</LI><BR>
r=a.remainder(b)<BR>
a/b �̏�] r ���v�Z���܂��B<BR>
c = (a/b).fix <BR>
r = a - c*b<BR>
�Ōv�Z����܂��B

<LI>abs</LI><BR>
���̐�Βl<BR>
c = a.abs<BR>

<LI>to_i</LI><BR>
�����_�ȉ���؂�̂ĂĐ����ɕϊ����܂��B<BR>
i = a.to_i<BR>
i �͒l�ɉ����� Fixnum �� Bignum �ɂȂ�܂��B
a �� Infinity �� NaN �̂Ƃ��Ai �� nil �ɂȂ�܂��B
<LI>to_f</LI><BR>
dup �ƑS�������ł��B
�����l�� BigDecimal �I�u�W�F�N�g�𐶐����܂��B
<LI>to_s</LI><BR>
������ɕϊ����܂�("0.xxxxxEn"�̌`�ɂȂ�܂��j�B<BR>
s = a.to_s
<LI>to_s2</LI><BR>
������ɕϊ����܂��B���������� n �����ɋ󔒂ŋ�؂�܂��B<BR>
s = a.to_s2(n)
<LI>exponent</LI><BR>
�w�����𐮐��l�ŕԂ��܂��B
n = a.exponent <BR>
�� a �̒l�� 0.xxxxxxx*10**n ���Ӗ����܂��B

<LI>E</LI><BR>
���R�ΐ��̒�e(=2.718281828....)���v�Z���܂��i�����Ƀe�C���[�W�J�Łj�B<BR>
e = BigDecimal::E(n)<BR>
n�͕K�v�ȗL�������𐮐��Ŏw�肵�܂��B
<LI>PI</LI><BR>
�~����(=3.14159265358979....)���v�Z���܂��iJ�DMachin�̌�����p���܂��j�B<BR>
e = BigDecimal::PI(n)<BR>
n �͕K�v�ȗL�������𐮐��Ŏw�肵�܂��B
<LI>BASE</LI><BR>
�����Ŏg�p������̒l�ł��B������ 32 �r�b�g�̏����n�ł�10000�ł��B<BR>
b = BigDecimal::BASE<BR>
<LI>mode</LI><BR>
BigDecimal�̎��s���ʂ𐧌䂵�܂��B�ȉ��̎g�p���@����`����Ă��܂��B<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_NaN,flag)<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_INFINITY,flag)<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_UNDERFLOW,flag)<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_OVERFLOW,flag)<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_ZERODIVIDE,flag)<BR>
f = BigDecimal::mode(BigDecimal::EXCEPTION_ALL,flag)<BR>

EXCEPTION_NaN �͌��ʂ� NaN �ɂȂ����Ƃ��̎w��ł��B
EXCEPTION_INFINITY �͌��ʂ�������(�}Infinity)
�ɂȂ����Ƃ��̎w��ł��B
EXCEPTION_UNDERFLOW �͎w�������A���_�[�t���[����Ƃ��̎w��ł��B
EXCEPTION_OVERFLOW �͎w�������I�[�o�[�t���[����Ƃ��̎w��ł��B
EXCEPTION_ZERODIVIDE �̓[���ɂ�銄��Z�����s�����Ƃ��̎w��ł��B
EXCEPTION_ALL �́A�”\�ȑS�Ăɑ΂��Ĉꊇ���Đݒ肷��Ƃ���
�g�p���܂��B
flag �� true �̂Ƃ��́A�w�肵����ԂɂȂ����Ƃ��ɗ�O�𔭍s
����悤�ɂȂ�܂��B
flag �� false�i�f�t�H���g�j�Ȃ�A��O�͔��s����܂���B�v�Z���ʂ�
�ȉ��̂悤�ɂȂ�܂��B<BR>
EXCEPTION_NaN �̂Ƃ��A��(NaN)<BR>
EXCEPTION_INFINITY �̂Ƃ��A����(+ or -Infinity)<BR>
EXCEPTION_UNDERFLOW �̂Ƃ��A�[��<BR>
EXCEPTION_OVERFLOW �̂Ƃ��A+Infinity �� -Infinity<BR>
EXCEPTION_ZERODIVIDE �̂Ƃ��A+Infinity �� -Infinity<BR>
EXCEPTION_INFINITY�AEXCEPTION_OVERFLOW�AEXCEPTION_ZERODIVIDE
�͍��̂Ƃ��듯���ł��B<BR>
�߂�l�́A�ݒ��̒l�ł��B�u�l�v�̈Ӗ��́A�Ⴆ��
BigDecimal::EXCEPTION_NaN�Ɓu�l�v�� & �� �[���ȊO�Ȃ��
EXCEPTION_NaN���ݒ肳��Ă���Ƃ����Ӗ��ł��B
flag �� nil�A�܂��́Atrue �� false �ȊO�Ȃ猻�݂̐ݒ�l���Ԃ�܂��B

<LI>limit([n])</LI><BR>
���������BigDecimal�I�u�W�F�N�g�̍ő包����n���ɐ������܂��B�߂�l��
�ݒ肷��O�̒l�ł��B�ݒ�l�̃f�t�H���g�l�͂O�ŁA�����������Ƃ����Ӗ��ł��B
n���w�肵�Ȃ��ꍇ�́A����̍ő包�����Ԃ�܂��B<BR>
mf = BigDecimal::limit(n)<BR>
<LI>sign</LI><BR>
�l�̑�����Ԃ��܂��B
n = a.sign <BR>
�Ƃ����Ƃ� n �̒l�� a ���ȉ��̂Ƃ����Ӗ����܂��B<BR>
() �̒��̐����́A���ۂ̒l�ł�(<A HREF="#STRUCT">�u�����\���v</A>���Q��)�B<BR>
n = BigDecimal::SIGN_NaN(0) : a �� NaN<BR>
n = BigDecimal::SIGN_POSITIVE_ZERO(1) : a �� +0<BR>
n = BigDecimal::SIGN_NEGATIVE_ZERO(-1) : a �� -0<BR>
n = BigDecimal::SIGN_POSITIVE_FINITE(2) : a �͐��̒l<BR>
n = BigDecimal::SIGN_NEGATIVE_FINITE(-2) : a �͕��̒l<BR>
n = BigDecimal::SIGN_POSITIVE_INFINITE(3) : a ��+Infinity<BR>
n = BigDecimal::SIGN_NEGATIVE_INFINITE(-3) : a ��-Infinity<BR>

<LI>nan?</LI><BR>
a.nan? �� a ��NaN�̂Ƃ��^��Ԃ��܂��B
<LI>infinite?</LI><BR>
a.infinite? �� a ��+���܂���-���̂Ƃ��^��Ԃ��܂��B
<LI>finite?</LI><BR>
a.finite? �� a �����܂��� NaN �łȂ��Ƃ��^��Ԃ��܂��B

<LI>to_parts</LI><BR>
BigDecimal �l�� 0.xxxxxxx*10**n �ƕ\�������Ƃ��ɁA�����iNaN�̂Ƃ���
0�A����ȊO��+1��-1�ɂȂ�܂��j�A
���������̕�����i"xxxxxxx"�j�ƁA��i10�j�A�X�Ɏw�� n ��z���
�Ԃ��܂��B<BR>
a=BigDecimal::new("3.14159265",10)<BR>
f,x,y,z = a.to_parts<BR>
�Ƃ���ƁAf=+1�Ax="314159265"�Ay=10�Az=1�ɂȂ�܂��B<BR>
�]���āA<BR>
s = "0."+x<BR>
b = f*(s.to_f)*(y**z)<BR>
�� Float �ɕϊ����邱�Ƃ��ł��܂��B
<LI>inspect</LI><BR>
�f�o�b�O�o�͂Ɏg�p����܂��B<BR>
p a=BigDecimal::new("3.14",10)<BR>
�Ƃ���ƁA[0x112344:'0.314E1',4(12)]�̂悤�ɏo�͂���܂��B
�ŏ���16�i���̓I�u�W�F�N�g�̃A�h���X�A���� '0.314E1' �͒l�A
����4�͌��݂̗L������(�\�����኱�傫�����Ƃ�����܂�)�A
�Ō�̓I�u�W�F�N�g����蓾��ő包���ɂȂ�܂��B

<LI>dup</LI><BR>
�����l�� BigDecimal �I�u�W�F�N�g�𐶐����܂��B
<LI>sqrt</LI><BR>
a�̗L���� n ���̕������in �̕������ł͂���܂���j�B
����܂��A�����Ƀj���[�g���@�Ōv�Z���܂��B<BR>
c = a.sqrt(n)<BR>
<LI>sincos</LI><BR>
a �̗L���� n ���� sin �� cos �𓯎��Ɂi�e�C���[�W�J�Łj�v�Z���āA
 sin �� cos �̔z���Ԃ��܂��B
n �͕K�v�ȗL�������ł��i n �� sin �� cos ���v�Z����킯�ł͂���܂���j�B
<BR>
sin,cos = a.sincos(n)<BR>
|a|<2*3.1415....�łȂ��Ɛ������������v�Z�ł��Ȃ����Ƃ�����܂��B
<LI>exp</LI><BR>
���R�ΐ��̒�e(=2.718281828....)�� a ����v�Z���܂��B<BR>
c = a.exp(n)<BR>
n �͕K�v�ȗL�������ł��B
<LI>power</LI><BR>
a �� n ����v�Z���܂��B���͐����B<BR>
c = a.power(n)<BR>
���ʂƂ��� c �̗L������ a �� n �{�ȏ�ɂȂ�̂Œ��ӁB
<LI>zero?</LI><BR>
a �� 0 �Ȃ� true �ɂȂ�܂��B<BR>
c = a.zero?<BR>
<LI>nonzero?</LI><BR>
a �� 0 �Ȃ� false�A0 �ȊO�Ȃ� a ���̂��̂��Ԃ�܂��B<BR>
c = a.nonzero?<BR>
<LI>&lt=&gt</LI><BR>
a==b �Ȃ� 0�Aa &gt b �Ȃ� 1�Aa &lt b �Ȃ� -1 �ɂȂ�܂��B<BR>
c = a &lt=&gt b <BR>
</UL>
��́A�ǂ�Ŏ��̔@���ł��B<BR>
<UL>
<LI>==</LI>
<LI>===</LI>
�u==�v�Ɠ����ł��� case ���Ŏg�p����܂��B
<LI>!=</LI>
<LI>&lt</LI>
<LI>&lt=</LI>
<LI>&gt</LI>
<LI>&gt=</LI>
</UL>
<H3>coerce�ɂ‚���</H3>
BigDecimal �I�u�W�F�N�g���Z�p���Z�q�̍��ɂ���Ƃ��́ABigDecimal �I�u�W�F�N�g��
�E�ɂ���I�u�W�F�N�g��(�K�v�Ȃ�) BigDecimal �ɕϊ����Ă���v�Z���܂��B
�]���āABigDecimal �I�u�W�F�N�g�ȊO�ł����l���Ӗ�������̂Ȃ�E�ɒu����
���Z�͉”\�ł��B<BR><BR>
������Ő��l��^����ꍇ�͒��ӂ��K�v�ł��B���l�ɕϊ��ł��Ȃ�����������ƁA
�P�ɕϊ����~�߂邾���ŃG���[�ɂ͂Ȃ�܂���B"10XX"�Ȃ�P�O�A"XXXX"�͂O
�ƈ����܂��B<BR>
<CODE><PRE>
   a = BigDecimal.E(20)
   c = a * "0.123456789123456789123456789" # ������ BigDecimal �ɕϊ����Ă���v�Z
</PRE></CODE>
�������񐔂�\�������Ƃ��āA"Infinity"�A"+Infinity"�A"-Infinity"�A"NaN"
���g�p�ł��܂�(�啶���E����������ʂ��܂�)�B�������Amode ���\�b�h�� false ��
�w�肵���ꍇ�͗�O���������܂��B
<BR>
�܂��ABigDecimal�N���X�� coerce�iRuby�{�Q�Ɓj���T�|�[�g���Ă��܂��B
�]���āABigDecimal �I�u�W�F�N�g���E�ɂ���ꍇ�����͑��v�ł��B
�����A���݂� Ruby �C���^�v���^�̎d�l��A�����񂪍��ɂ���ƌv�Z�ł��܂���B<BR>
<CODE><PRE>
  a = BigDecimal.E(20)
  c = "0.123456789123456789123456789" * a # �G���[
</PRE></CODE>
�K�v��������Ƃ͎v���܂��񂪁A�ǂ����Ă��ƌ����l��
 String �I�u�W�F�N�g���p�������V���ȃN���X���쐬���Ă���A
���̃N���X�� coerce ���T�|�[�g���Ă��������B

<hr>
<A NAME="#UNDEF">
<H2>�����A�񐔁A�[���̈���</H2>
�u�����v�Ƃ͕\���ł��Ȃ����炢�傫�Ȑ��ł��B���ʂɈ������߂�
 +Infinity�i���̖�����j�� -Infinity�i���̖�����j�Ƃ���
�悤�ɕ\�L����܂��B
������ 1.0/0.0 �̂悤�Ƀ[���Ŋ���悤�Ȍv�Z�������Ƃ��ɐ�������܂��B
<BR><BR>
�u�񐔁v�� 0.0/0.0 �� Infinity-Infinity ���̌��ʂ���`�ł��Ȃ�
�v�Z�������Ƃ��ɐ�������܂��B�񐔂� NaN�iNot a Number�j�ƕ\�L����܂��B
NaN ���܂ތv�Z�͑S�� NaN �ɂȂ�܂��B�܂� NaN �͎������܂߂āA�ǂ�Ȑ�
�Ƃ���v���܂���B
<BR><BR>
�[���� +0.0 �� -0.0 �����݂��܂��B�������A+0.0==-0.0 �� true �ł��B
<BR><BR>
Infinity�ANaN�A +0.0 �� -0.0 �����܂񂾌v�Z���ʂ͑g�ݍ��킹��
��蕡�G�ł��B�����̂���l�́A�ȉ��̃v���O���������s���Č��ʂ�
�m�F���Ă��������i���ʂɂ‚��āA�^���ԈႢ�𔭌����ꂽ����
���m�点�肢�܂��j�B

<PRE>
<CODE>
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
</CODE>
</PRE>

<hr>
<A NAME="#STRUCT">
<H2>�����\��</H2>
BigDecimal�����ŕ��������_�͍\����(Real)�ŕ\������܂��B
���̂����������� unsigned long �̔z��(�ȉ��̍\���̗v�ffrac)�ŊǗ�����܂��B
�T�O�I�ɂ́A�ȉ��̂悤�ɂȂ�܂��B<BR><BR>
 <���������_��> = 0.xxxxxxxxx*BASE**n<BR><BR>
�����ŁAx�͉�������\�������ABASE�͊�i�P�O�i�Ȃ�P�O�j�An�͎w������\��
�����l�ł��BBASE���傫���قǁA�傫�Ȑ��l���\���ł��܂��B�‚܂�A�z��̃T�C�Y��
���Ȃ��ł��܂��BBASE�͑傫���قǓs�����悢�킯�ł����A�f�o�b�O�̂��₷���Ȃǂ�
�l�����āA10000�ɂȂ��Ă��܂��iBASE��VpInit()�֐��Ŏ����I�Ɍv�Z���܂��j�B
����́A32�r�b�g�����̏ꍇ�ł��B64�r�b�g�����̏ꍇ�͂����Ƒ傫�Ȓl�ɂȂ�܂��B
�c�O�Ȃ���A64�r�b�g�����ł̃e�X�g�͂܂�����Ă��܂���i�����A���ꂽ���������
���ʂ������Ă���������΂��肪�����ł��j�B
BASE��10000�̂Ƃ��́A�ȉ��̉������̔z��(frac)�̊e�v�f�ɂ͍ő�łS����
�������i�[����܂��B<BR><BR>
���������_�\����(Real)�͈ȉ��̂悤�ɂȂ��Ă��܂��B
<BR>
<CODE><PRE>
  typedef struct {
     unsigned long MaxPrec; // �ő吸�x(frac[]�̔z��T�C�Y)
     unsigned long Prec;    // ���x(frac[]�̎g�p�T�C�Y)
     short    sign;         // �ȉ��̂悤�ɕ������̏�Ԃ��`���܂��B
                            //  ==0 : NaN
                            //    1 : +0
                            //   -1 : -0
                            //    2 : ���̒l
                            //   -2 : ���̒l
                            //    3 : +Infinity
                            //   -3 : -Infinity
     unsigned short flag;   // �e��̐���t���b�O
     int      exponent;     // �w�����̒l(������*BASE**exponent)
     unsigned long frac[1]; // �������̔z��(�•�)
  } Real;
</CODE></PRE>
�Ⴆ�� 1234.56784321 �Ƃ���������(BASE=10000�Ȃ�)<BR>
<PRE>
    0.1234 5678 4321*(10000)**1
</PRE>
�ł����� frac[0]=1234�Afrac[1]=5678�Afrac[2]=4321�A
Prec=3�Asign=2�Aexponent=1 �ƂȂ�܂��BMaxPrec��
Prec ���傫����΂����‚ł����܂��܂���Bflag ��
�g�p���@�͎����Ɉˑ����ē����Ŏg�p����܂��B

<hr>
<A NAME="#BASE">
<H2>2�i��10�i</H2>
BigDecimal �� <���������_��> = 0.xxxxxxxxx*10**n �Ƃ���10�i�`���Ő��l��ێ����܂��B
�������A�v�Z�@�̕��������_���̓����\���́A�����܂ł��Ȃ� <���������_��> = 0.bbbbbbbb*2**n �Ƃ���
2�i�`�������ʂł�(x �� 0 ���� 9 �܂ŁAb �� 0 �� 1 �̐���)�B
BigDecimal ���Ȃ�10�i�̓����\���`�����̗p�����̂����ȉ��ɐ������܂��B
<H4>10�i�̃����b�g</H4>
<DL>
<DT>�f�o�b�O�̂��₷��
<DD>�܂��A�v���O�����쐬���y�ł��Bfrac[0]=1234�Afrac[1]=5678�Afrac[2]=4321�A
exponent=1�Asign=2 �Ȃ琔�l�� 1234.56784321 �ł���̂͌���Β����ɕ�����܂��B

<DT>10�i�\�L���ꂽ���l�Ȃ�m���ɓ����\���ɕϊ��ł���
<DD>�Ⴆ�΁A�ȉ��̂悤�ȃv���O�����͑S���덷������
�v�Z���邱�Ƃ��ł��܂��B�ȉ��̗�́A��s�Ɉ�‚̐��l
�������Ă���t�@�C�� file �̍��v���l�����߂���̂ł��B
<PRE><CODE>
   file = File::open(....,"r")
   s = BigDecimal::new("0")
   while line = file.gets
      s = s + line
   end
</CODE></PRE>
���̗��2�i���ł��ƌ덷�����荞�މ”\��������܂��B
�Ⴆ�� 0.1 ��2�i�ŕ\������� 0.1 = b1*2**(-1)+b1*2**(-2)+b3*2**(-3)+b4*2**(-4)....
�Ɩ����ɑ����Ă��܂��܂�(b1=0,b2=0,b3=0,b4=1...)�B������ bn(n=1,2,3,...) ��
2�i��\������ 0 �� 1 �̐�����ł��B�]���āA�ǂ����őł��؂�K�v������܂��B
�����ŕϊ��덷������܂��B�������A������ēx10�i�\�L�ɂ��Ĉ������悤��
�ꍇ�͓K�؂Ȋۂߑ���i�l�̌ܓ��j�ɂ���čĂ� "0.1" �ƕ\������܂��B�������A
�����ł͐��m�� 0.1 �ł͂���܂���B

<DT>�L�������͗L���ł���i�‚܂莩������ł���j
<DD>0.1 ��\�����邽�߂̗̈�͂�������‚̔z��v�f�i frac[0]=1 �j�ōς݂܂��B
�z��v�f�̐���10�i���l���玩���I�Ɍ���ł��܂��B����́A�•ϒ����������_���Z�ł�
�厖�Ȃ��Ƃł��B�t�� 0.1 ��2�i�\�������Ƃ��ɂ�2�i�̗L�����������‚ɂ���̂� 0.1 ��
���������ł͌���ł��܂���B
</DL>

<H3>10�i�̃f�����b�g</H3>
���͍��܂ł̃����b�g�́A���̂܂܃f�����b�g�ɂ��Ȃ�܂��B
���������A10�i��2�i�A2�i��10�i�ɕϊ�����悤�ȑ���͕ϊ��덷
�𔺂��ꍇ��������邱�Ƃ͂ł��܂���B
���Ɍv�Z�@�����Ɏ�荞�܂ꂽ2�i���l�� BigDecimal �̓����\����
�ϊ�����Ƃ��ɂ͌덷���������Ȃ��ꍇ������܂��B

<H3>�ŏ��͉����H</H3>
�����Ōv�Z����Ƃ��ɂ킴�킴2�i�����g���l�͋ɂ߂Ă܂�ł��B
�v�Z�@�Ƀf�[�^����͂���Ƃ����قƂ�ǂ̏ꍇ�A
10�i���œ��͂��܂��B���̌��ʁAdouble ���̌v�Z�@����
�\���͍ŏ�����덷�������Ă���ꍇ������܂��B
BigDecimal �̓��[�U���͂��덷�����Ŏ�荞�ނ��Ƃ��ł��܂��B
�f�o�b�O�����₷���̂ƁA�f�[�^�ǂ݂��ݎ��Ɍ덷������Ȃ�
�Ƃ����̂����ۂ̃����b�g�ł��B

<hr>
<A NAME="#PREC">
<H2>�v�Z���x�ɂ‚���</H2>
c = a op b �Ƃ����v�Z(op �� + - * /)�������Ƃ��̓����
�ȉ��̂悤�ɂȂ�܂��B<BR><BR>
�P�D��Z�Ə��Z��(a �̗L������)+(a �̗L������)���̍ő包���i���ۂ́A�]�T�������āA
���������傫���Ȃ�܂��j�����•ϐ� c ��V���ɐ������܂��B
�����Z�̏ꍇ�́A�덷���o�Ȃ������̐��x������ c �𐶐����܂��B�Ⴆ��
 c = 0.1+0.1*10**(-100) �̂悤�ȏꍇ�Ac �̐��x�͂P�O�O���ȏ�̐��x��
���‚悤�ɂȂ�܂��B
<BR>
�Q�D���� c = a op b �̌v�Z�����s���܂��B<BR><BR>
���̂悤�ɁA�����Z�Ə�Z�ł� c �͕K���u�덷���o�Ȃ��v�����̐��x��
�����Đ�������܂��B���Z��(a �̗L������)+(a �̗L������)���̍ő包��
������ c ����������܂����Ac = 1.0/3.0 �̂悤�Ȍv�Z�Ŗ��炩�Ȃ悤�ɁA
 c �̍ő吸�x�𒴂���Ƃ���Ōv�Z���ł��؂���ꍇ������܂��B<BR><BR>
������ɂ���Ac �̍ő吸�x�� a �� b ���傫���Ȃ�܂��̂� c ���K�v�Ƃ���
�������[�̈�͑傫���Ȃ邱�Ƃɒ��ӂ��ĉ������B
<BR><BR>
���ӁF�u+,-,*,/�v�ł͌��ʂ̐��x�i�L�������j�������Ŏw��ł��܂���B
���x���R���g���[���������ꍇ�́A�ȉ��� add,sub ���̃��\�b�h
���g�p���܂��B<BR>

<H3>�����Ő��x���R���g���[���������ꍇ</H3>
�����Ő��x(�L������)���R���g���[���������ꍇ�� assign�Aadd�Asub�Amult�Adiv ���̃��\�b�h
���g�p�ł��܂��B
�ȉ��̉~�������v�Z����v���O������̂悤�ɁA
���߂錅���͎����Ŏw�肷�邱�Ƃ��ł��܂��B
<BR><BR>
<CODE><PRE>
#!/usr/local/bin/ruby

#
# pai.rb
#  USAGE: ruby pai.rb n
#   where n is the number of digits required.
#  EX.: ruby pai.rb 1000
#

require "bigdecimal"
#
# Calculates 3.1415.... using J. Machin's formula.
#
def pai(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.exponent >= exp) 
    t   = t*m25
    u,r = 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.exponent >= exp )
    t,r = t.div(m57121,sig)
    u,r = t.div(k,sig)
    pi  = pi + u
    k   = k+two
  end
  pi
end

if $0 == __FILE__
  print "PAI("+ARGV[0]+"):\n"
  p pai(ARGV[0].to_i)
end

</PRE></CODE>
<HR>
<FONT size=2>
<I>
<A HREF="http://www.tinyforest.gr.jp">
���� �ΗY
</A>
(E-Mail:<A HREF="mailto:shigeo@tinyforest.gr.jp">&ltshigeo@tinyforest.gr.jp&gt</U></A>)
</I>
</FONT>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>