<!-- saved from url=(0022)http://internet.e-mail --> <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://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 <CODE><PRE> require 'bigdecimal' a=BigDecimal::new("0.123456789123456789") b=BigDecimal("123456.78912345678",40) c=a+b </PRE></CODE> <br> �Ƃ����悤�Ȋ����Ŏg�p���܂��B <H3>���\�b�h�ꗗ</H3> �ȉ��̃��\�b�h�����p�\�ł��B �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 <P> �ȉ��̃��\�b�h�ȊO�ɂ��A(C �ł͂Ȃ�) Ruby �\�[�X�̌`�� ����Ă�����̂�����܂��B�Ⴆ�A <CODE><PRE> require "bigdecimal/math.rb" </PRE></CODE> �Ƃ��邱�ƂŁAsin �� cos �Ƃ����������g�p�ł���悤�ɂȂ�܂��B �g�p���@�ȂǁA�ڍׂ� math.rb �̓��e���Q�Ƃ��ĉ������B ���̑��AFloat �Ƃ̑��ݕϊ��Ȃǂ̃��\�b�h�� util.rb �ŃT�|�[�g����Ă��܂��B ���p����ɂ� <CODE><PRE> require "bigdecimal/util.rb" </PRE></CODE> �̂悤�ɂ��܂��B�ڍׂ� util.rb �̓��e���Q�Ƃ��ĉ������B <H4><U>�N���X���\�b�h</U></H4> <UL> <LI><B>new</B></LI><BLOCKQUOTE> �V���� BigDecimal �I�u�W�F�N�g�����܂��B<BR> a=BigDecimal::new(s[,n]) �܂���<BR> a=BigDecimal(s[,n])<BR> s �͐�����\�����鏉���l����Ŏw�肵�܂��B �X�y�[�X�͖�������܂��B�܂��A���f�ł��Ȃ��������o���������_�� ������͏I���������̂Ƃ݂Ȃ���܂��B 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 �ő�L�������͈ȉ��̂悤�Ȋ���Z�����s����Ƃ����ɈӖ��������܂��B <CODE><PRE> BigDecimal("1") / BigDecimal("3") # => 0.3333333333 33E0 BigDecimal("1",10) / BigDecimal("3",10) # => 0.3333333333 3333333333 33333333E0 </PRE></CODE> �������A�X�̉��Z�ɂ�����ő�L������ n �̎�舵���͏����̃o�[�W������ ��ύX�����\��������܂��B </BLOCKQUOTE> <LI><B>mode</B></LI><BLOCKQUOTE> f = BigDecimal.mode(s[,v])<BR> BigDecimal�̎��s���ʂ𐧌䂵�܂��B��Q�������ȗ��A�܂��� nil ���w�肷��� ����̐ݒ�l���߂�܂��B<BR> �ȉ��̎g�p���@����`����Ă��܂��B <P> <B>[��O����]</B><P> �v�Z���ʂ���(NaN)��[���ɂ�鏜�Z�ɂȂ����Ƃ��̏������`���邱�Ƃ��ł��܂��B <BLOCKQUOTE> 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> </BLOCKQUOTE> EXCEPTION_NaN �͌��ʂ� NaN �ɂȂ����Ƃ��̎w��ł��B<BR> EXCEPTION_INFINITY �͌��ʂ�������(�}Infinity)�ɂȂ����Ƃ��̎w��ł��B<BR> EXCEPTION_UNDERFLOW �͎w�������A���_�[�t���[����Ƃ��̎w��ł��B<BR> EXCEPTION_OVERFLOW �͎w�������I�[�o�[�t���[����Ƃ��̎w��ł��B<BR> EXCEPTION_ZERODIVIDE �̓[���ɂ�銄��Z�����s�����Ƃ��̎w��ł��B<BR> EXCEPTION_ALL �́A�\�ȑS�Ăɑ��Ĉꊇ���Đݒ肷��Ƃ��Ɏg�p���܂��B<BR><BR> flag �� true �̂Ƃ��́A�w�肵����ԂɂȂ����Ƃ��ɗ�O�s����悤�ɂȂ�܂��B<BR> flag �� false�i�f�t�H���g�j�Ȃ�A��O�͔��s����܂���B�v�Z���ʂ͈ȉ��̂悤�ɂȂ�܂��B<BR> <BLOCKQUOTE> 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> </BLOCKQUOTE> 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 <P> <B>[�ۂߏ����w��]</B><P> �v�Z�r���̊ۂߑ���̎w�肪�ł��܂��B <BLOCKQUOTE> f = BigDecimal::mode(BigDecimal::ROUND_MODE,flag) </BLOCKQUOTE> �̌`���Ŏw�肵�܂��B<BR> �����ŁAflag �͈ȉ�(���ʓ��͑Ή�����C���X�^���X���\�b�h)�̈���w�肵�܂��B <TABLE> <TR><TD>ROUND_UP</TD><TD>�S�Đ�グ�܂��B</TD></TR> <TR><TD>ROUND_DOWN</TD><TD>�S�Đ�̂Ă܂�(truncate)�B</TD></TR> <TR><TD>ROUND_HALF_UP</TD><TD>�l�̌ܓ����܂�(�f�t�H���g)�B</TD></TR> <TR><TD>ROUND_HALF_DOWN</TD><TD>�̘Z�����܂��B</TD></TR> <TR><TD>ROUND_HALF_EVEN</TD><TD>�l�̘Z�����܂��B�T�̎��͏�ʂP������̎��̂J��グ�܂�(Banker's rounding)�B</TD></TR> <TR><TD>ROUND_CEILING</TD><TD>���l�̑傫�����ɌJ��グ�܂�(ceil)�B</TD></TR> <TR><TD>ROUND_FLOOR</TD><TD>���l�̏��������ɌJ�艺���܂�(floor)�B</TD></TR> </TABLE> �߂�l�͎w���� flag �̒l�ł��B ��Q������ nil ���w�肷��ƁA����̐ݒ�l���Ԃ�܂��B mode ���\�b�h�ł͊ۂߑ���̈ʒu�����[�U���w�肷�邱�Ƃ͂ł��܂���B �ۂߑ���ƈʒu�������Ő��䂵�����ꍇ�� BigDecimal::limit �� truncate/round/ceil/floor�A add/sub/mult/div �Ƃ������C���X�^���X���\�b�h���g�p���ĉ������B </BLOCKQUOTE> <LI><B>limit([n])</B></LI><BLOCKQUOTE> ���������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�܂��� n �� nil �̏ꍇ�́A����̍ő包�����Ԃ�܂��B<BR> �v�Z�s����ԂɁA�����̌������������ɑ����Ă��܂��悤�ȏꍇ limit �ŗ\�ߌ����𐧌��ł��܂��B���̏ꍇ BigDecimal.mode �Ŏw�肳�ꂽ �ۂߏ��������s����܂��B �������A�C���X�^���X���\�b�h (truncate/round/ceil/floor/add/sub/mult/div) �� ���������� limit ���D�悳��܂��B<BR> mf = BigDecimal::limit(n)<BR> </BLOCKQUOTE> <LI><B>double_fig</B></LI><BLOCKQUOTE> Ruby �� Float �N���X���ێ��ł���L�������̐���Ԃ��܂��B <CODE><PRE> p BigDecimal::double_fig # ==> 20 (depends on the CPU etc.) </PRE></CODE> double_fig�͈ȉ��� C �v���O�����̌��ʂƓ����ł��B <CODE><PRE> double v = 1.0; int double_fig = 0; while(v + 1.0 > 1.0) { ++double_fig; v /= 10; } </PRE></CODE> </BLOCKQUOTE> <LI><B>BASE</B></LI><BLOCKQUOTE> �����Ŏg�p������̒l�ł��B������ 32 �r�b�g�̏����n�ł�10000�ł��B<BR> b = BigDecimal::BASE<BR> </BLOCKQUOTE> </UL> <H4><U>�C���X�^���X���\�b�h</U></H4> <UL> <LI><B>+</B></LI><BLOCKQUOTE> ���Z�ic = a + b�j<BR> c �̐��x�ɂ��Ắu<A HREF="#PREC">�v�Z���x�ɂ���</A>�v���Q�Ƃ��Ă��������B </BLOCKQUOTE> <LI><B>-</B></LI><BLOCKQUOTE> ���Z�ic = a - b�j�A�܂��͕������]�ic = -a�j<BR> c �̐��x�ɂ��Ắu<A HREF="#PREC">�v�Z���x�ɂ���</A>�v���Q�Ƃ��Ă��������B </BLOCKQUOTE> <LI><B>*</B></LI><BLOCKQUOTE> ��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 </BLOCKQUOTE> <LI><B>/</B></LI><BLOCKQUOTE> ���Z(c = a / b)<BR> c �̐��x�ɂ��Ắu<A HREF="#PREC">�v�Z���x�ɂ���</A>�v���Q�Ƃ��Ă��������B </BLOCKQUOTE> <LI><B>add(b,n)</B></LI><BLOCKQUOTE> �ȉ��̂悤�Ɏg�p���܂��B<BR> c = a.add(b,n)<BR> c = a + b ���ő�� n ���܂Ōv�Z���܂��B<BR> a + b �̐��x�� n ���傫���Ƃ��� BigDecimal.mode �Ŏw�肳�ꂽ���@�Ŋۂ߂��܂��B<BR> n ���[���Ȃ� + �Ɠ����ł��B </BLOCKQUOTE> <LI><B>sub(b,n)</B></LI><BLOCKQUOTE> �ȉ��̂悤�Ɏg�p���܂��B<BR> c = a.sub(b,n)<BR> c = a - b ���ő�� n ���܂Ōv�Z���܂��B<BR> a - b �̐��x�� n ���傫���Ƃ��� BigDecimal.mode �Ŏw�肳�ꂽ���@�Ŋۂ߂��܂��B<BR> n ���[���Ȃ� - �Ɠ����ł��B </BLOCKQUOTE> <LI><B>mult(b,n)</B></LI><BLOCKQUOTE> �ȉ��̂悤�Ɏg�p���܂��B<BR> c = a.mult(b,n)<BR> c = a * b ���ő�� n ���܂Ōv�Z���܂��B<BR> a * b �̐��x�� n ���傫���Ƃ��� BigDecimal.mode �Ŏw�肳�ꂽ���@�Ŋۂ߂��܂��B<BR> n ���[���Ȃ� * �Ɠ����ł��B </BLOCKQUOTE> <LI><B>div(b[,n])</B></LI><BLOCKQUOTE> �ȉ��̂悤�Ɏg�p���܂��B<BR> c = a.div(b,n)<BR> c = a / b ���ő�� n ���܂Ōv�Z���܂��B a / b �̐��x�� n ���傫���Ƃ��� BigDecimal.mode �Ŏw�肳�ꂽ���@�Ŋۂ߂��܂��B<BR> n ���[���Ȃ� / �Ɠ����ł��B<BR> n ���ȗ����ꂽ�Ƃ��� Float#div �Ɠ��l�Ɍ��ʂ�����(BigDecimal)�ɂȂ�܂��B </BLOCKQUOTE> <LI><B>fix</B></LI><BLOCKQUOTE> a �̏����_�ȉ��̐�̂āB<BR> c = a.fix </BLOCKQUOTE> <LI><B>frac</B></LI><BLOCKQUOTE> a �̐��������̐�̂āB<BR> c = a.frac </BLOCKQUOTE> <LI><B>floor[(n)]</B></LI><BLOCKQUOTE> c = a.floor<BR> a �ȉ��̍ő吮���iBigDecimal �l�j��Ԃ��܂��B <CODE><PRE> c = BigDecimal("1.23456").floor # ==> 1 c = BigDecimal("-1.23456").floor # ==> -2 </PRE></CODE> �ȉ��̂悤�Ɉ��� n ��^���邱�Ƃ��ł��܂��B<BR> n>=0 �Ȃ�A�����_�ȉ� n+1 �ʂ̐����𑀍삵�܂�(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR> n �����̂Ƃ��͏����_�ȏ� n ���ڂ𑀍삵�܂�(�����_�ʒu���獶�ɏ��Ȃ��Ƃ� n �� 0 �����т܂�)�B<BR> <CODE><PRE> c = BigDecimal("1.23456").floor(4) # ==> 1.2345 c = BigDecimal("15.23456").floor(-1) # ==> 10.0 </PRE></CODE> </BLOCKQUOTE> <LI><B>ceil[(n)]</B></LI><BLOCKQUOTE> c = a.ceil<BR> a �ȏ�̐����̂����A�ł��������������v�Z���A���̒l�iBigDecimal �l�j��Ԃ��܂��B <CODE><PRE> c = BigDecimal("1.23456").ceil # ==> 2 c = BigDecimal("-1.23456").ceil # ==> -1 </PRE></CODE> �ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂��B<BR> n>=0 �Ȃ�A�����_�ȉ� n+1 �ʂ̐����𑀍삵�܂�(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR> n �����̂Ƃ��͏����_�ȏ� n ���ڂ��𑀍삵�܂�(�����_�ʒu���獶�ɏ��Ȃ��Ƃ� n �� 0 �����т܂�)�B<BR> <CODE><PRE> c = BigDecimal("1.23456").ceil(4) # ==> 1.2346 c = BigDecimal("15.23456").ceil(-1) # ==> 20.0 </PRE></CODE> </BLOCKQUOTE> <LI><B>round[(n[,b])]</B></LI><BLOCKQUOTE> c = a.round<BR> �N���X���\�b�h BigDecimal::mode(BigDecimal::ROUND_MODE,flag) �Ŏw�肵�� ROUND_MODE �ɏ]���Ċۂߑ�������s���܂��B BigDecimal::mode(BigDecimal::ROUND_MODE,flag) �ʼn����w�肹���A���A���� ���w�肵�Ȃ��ꍇ�́u�����_�ȉ����ʂ̐����l�̌ܓ����Đ����iBigDecimal �l�j�v�ɂ��܂��B<BR> <CODE><PRE> c = BigDecimal("1.23456").round # ==> 1 c = BigDecimal("-1.23456").round # ==> -1 </PRE></CODE> �ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂��B<BR> n �����̎��́A�����_�ȉ� n+1 �ʂ̐������ۂ߂܂�(�����_�ȉ����A�ő� n ���ɂ��܂�)�B<BR> n �����̂Ƃ��͏����_�ȏ� n ���ڂ��ۂ߂܂�(�����_�ʒu���獶�ɏ��Ȃ��Ƃ� n �� 0 �����т܂�)�B <CODE><PRE> c = BigDecimal("1.23456").round(4) # ==> 1.2346 c = BigDecimal("15.23456").round(-1) # ==> 20.0 </PRE></CODE> �Q�Ԗڂ̈������w�肷��ƁABigDecimal#mode �̎w������āA�w�肳�ꂽ���@�� �ۂߑ�������s���܂��B <CODE><PRE> c = BigDecimal("1.23456").round(3,BigDecimal::ROUND_HALF_EVEN) # ==> 1.234 c = BigDecimal("1.23356").round(3,BigDecimal::ROUND_HALF_EVEN) # ==> 1.234 </PRE></CODE> </BLOCKQUOTE> <LI><B>truncate</B></LI><BLOCKQUOTE> c = a.truncate<BR> �����_�ȉ��̐����̂ĂĐ����iBigDecimal �l�j�ɂ��܂��B<BR> �ȉ��̂悤�Ɉ�����^���āA�����_�ȉ� n+1 �ʂ̐����𑀍삷�邱�Ƃ��ł��܂��B<BR> n �����̎��́A�����_�ȉ� n+1 �ʂ̐������̂Ă܂�(�����_�ȉ����A�ő� n ���ɂ��܂�)�B n �����̂Ƃ��͏����_�ȏ� n ���ڂ��𑀍삵�܂�(�����_�ʒu���獶�ɏ��Ȃ��Ƃ� n �� 0 �����т܂�)�B<BR> <CODE><PRE> c = BigDecimal("1.23456").truncate(4) # ==> 1.2345 c = BigDecimal("15.23456").truncate(-1) # ==> 10.0 </PRE></CODE> </BLOCKQUOTE> </BLOCKQUOTE> <LI><B>abs</B></LI><BLOCKQUOTE> ���̐�Βl<BR> c = a.abs<BR> </BLOCKQUOTE> <LI><B>to_i</B></LI><BLOCKQUOTE> �����_�ȉ����̂ĂĐ����ɕϊ����܂��B<BR> i = a.to_i<BR> i �͒l�ɉ����� Fixnum �� Bignum �ɂȂ�܂��B a �� Infinity �� NaN �̂Ƃ��Ai �� nil �ɂȂ�܂��B </BLOCKQUOTE> <LI><B>to_f</B></LI><BLOCKQUOTE> Float �I�u�W�F�N�g�ɕϊ����܂��B ��肫�ߍׂ����l���K�v�Ȃ�� split ���\�b�h�𗘗p���� ���������B </BLOCKQUOTE> <LI><B>to_s[(n)]</B></LI><BLOCKQUOTE> ������ɕϊ����܂�(�f�t�H���g�� "0.xxxxxEn" �̌`�ɂȂ�܂��j�B <CODE><PRE> BigDecimal("1.23456").to_s # ==> "0.123456E1" </PRE></CODE> ���� n �ɐ��̐������w�肳�ꂽ�Ƃ��́A�����_�ŕ������鍶�E�������A���ꂼ�� n ���� �ɋŋ��܂��B <CODE><PRE> BigDecimal("0.1234567890123456789").to_s(10) # ==> "0.1234567890 123456789E0" </PRE></CODE> ���� n �ɐ��̐�����\����������w�肷�邱�Ƃ��ł��܂��B <CODE><PRE> BigDecimal("0.1234567890123456789").to_s("10") # ==> "0.1234567890 123456789E0" </PRE></CODE> ������̍ŏ��� '+'�i�܂��� ' '�j��t����ƁA�l�����̏ꍇ�A�擪�� '+'�i�܂��� ' '�j���t���܂� �i���̏ꍇ�́A��� '-' ���t���܂��B�j�B <CODE><PRE> BigDecimal("0.1234567890123456789").to_s(" 10") # ==> " 0.1234567890 123456789E0" BigDecimal("0.1234567890123456789").to_s("+10") # ==> "+0.1234567890 123456789E0" BigDecimal("-0.1234567890123456789").to_s("10") # ==> "-0.1234567890 123456789E0" </PRE></CODE> ����ɕ�����̍Ō�� E(�܂��� e) �� F(�܂��� f) ���w�肷�邱�ƂŁA�ȉ��̂悤�� �\���`����ύX���邱�Ƃ��ł��܂��B <CODE><PRE> BigDecimal("1234567890.123456789").to_s("E") # ==> "0.1234567890123456789E10" BigDecimal("1234567890.123456789").to_s("F") # ==> "1234567890.123456789" BigDecimal("1234567890.123456789").to_s("5E") # ==> "0.12345 67890 12345 6789E10" BigDecimal("1234567890.123456789").to_s("5F") # ==> "12345 67890.12345 6789" </PRE></CODE> </BLOCKQUOTE> <LI><B>exponent</B></LI><BLOCKQUOTE> �w�����𐮐��l�ŕԂ��܂��B n = a.exponent <BR> �� a �̒l�� 0.xxxxxxx*10**n ���Ӗ����܂��B </BLOCKQUOTE> <LI><B>precs</B></LI><BLOCKQUOTE> n,m = a.precs<BR> a �̗L������ (n) �ƍő�L������ (m) �̔z���Ԃ��܂��B </BLOCKQUOTE> <LI><B>sign</B></LI><BLOCKQUOTE> �l����(sign > 0)�A��(sign < 0)�A���̑�(sigh==0)�ł��邩�̏���Ԃ��܂��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> </BLOCKQUOTE> <LI><B>nan?</B></LI><BLOCKQUOTE> a.nan? �� a ��NaN�̂Ƃ��^��Ԃ��܂��B </BLOCKQUOTE> <LI><B>infinite?</B></LI><BLOCKQUOTE> a.infinite? �� a ��+���̂Ƃ� 1 �A-���̂Ƃ��� -1�A����ȊO�̂Ƃ��� nil ��Ԃ��܂��B </BLOCKQUOTE> <LI><B>finite?</B></LI><BLOCKQUOTE> a.finite? �� a �����܂��� NaN �łȂ��Ƃ��^��Ԃ��܂��B </BLOCKQUOTE> <LI><B>zero?</B></LI><BLOCKQUOTE> a �� 0 �Ȃ� true �ɂȂ�܂��B<BR> c = a.zero? </BLOCKQUOTE> <LI><B>nonzero?</B></LI><BLOCKQUOTE> a �� 0 �Ȃ� nil�A0 �ȊO�Ȃ� a ���̂��̂��Ԃ�܂��B<BR> c = a.nonzero? </BLOCKQUOTE> <LI><B>split</B></LI><BLOCKQUOTE> 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")<BR> f,x,y,z = a.split<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 </BLOCKQUOTE> <LI><B>inspect</B></LI><BLOCKQUOTE> �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 </BLOCKQUOTE> <LI><B>**</B></LI><BLOCKQUOTE> a �� n ����v�Z���܂��B���͐����B<BR> c = a ** n<BR> ���ʂƂ��� c �̗L������ a �� n �{�ȏ�ɂȂ�̂Œ��ӁB </BLOCKQUOTE> <LI><B>power</B></LI><BLOCKQUOTE> ** �Ɠ����ŁAa �� n ����v�Z���܂��B���͐����B<BR> c = a.power(n)<BR> ���ʂƂ��� c �̗L������ a �� n �{�ȏ�ɂȂ�̂Œ��ӁB </BLOCKQUOTE> <LI><B>sqrt</B></LI><BLOCKQUOTE> a�̗L���� n ���̕������in �̕������ł͂���܂���j�� �j���[�g���@�Ōv�Z���܂��B<BR> c = a.sqrt(n)<BR> </BLOCKQUOTE> <LI><B>divmod,quo,modulo,%,remainder</B></LI><BLOCKQUOTE> �ڍׂ͑Ή����� Float �̊e���\�b�h���Q�Ƃ��ĉ������B </BLOCKQUOTE> <LI><B><=></B></LI><BLOCKQUOTE> a==b �Ȃ� 0�Aa > b �Ȃ� 1�Aa < b �Ȃ� -1 �ɂȂ�܂��B<BR> c = a <=> b </BLOCKQUOTE> </UL> ��́A�ǂ�Ŏ��̔@���ł��B<BR> <UL> <LI><B>==</B></LI> <LI><B>===</B></LI> �u==�v�Ɠ����ł��� case ���Ŏg�p����܂��B <LI><B>!=</B></LI> <LI><B><</B></LI> <LI><B><=</B></LI> <LI><B>></B></LI> <LI><B>>=</B></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> �������A������́i�ʏ�j���l�Ɏ����ϊ����邱�Ƃ͂ł��܂���B ������𐔒l�Ɏ����ϊ��������ꍇ�� bigfloat.c �� �u/* #define ENABLE_NUMERIC_STRING */�v�̃R�����g���O���Ă���A �ăR���p�C���A�ăC���X�g�[������K�v������܂��B ������Ő��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 <CODE><PRE> file = File::open(....,"r") s = BigDecimal::new("0") while line = file.gets s = s + line end </PRE></CODE> ���̗��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�ɕϊ�����悤�ȑ���͕ϊ��덷 ���ꍇ��������邱�Ƃ͂ł��܂���B ��T�̃R���s���[�^��10�i�̓����\���������Ă��Ȃ��̂ŁA BigDecimal �𗘗p���Č덷�����̌v�Z������ꍇ�́A�v�Z���x �����Ă��Ō�܂� BigDecimal ���g�p������K�v������܂��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��(a �̗L������)+(b �̗L������)�A ���Z��(a �̍ő�L������)+(b �̍ő�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><BR> �Q�D���� c = a op b �̌v�Z�����s���܂��B<BR><BR> ���̂悤�ɁA�����Z�Ə�Z�ł� c �͕K���u�덷���o�Ȃ��v�����̐��x�� �����Đ�������܂�(BigDecimal.limit ���w�肵�Ȃ��ꍇ)�B ���Z��(a �̍ő�L������)+(b �̍ő�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�ȉ��̃C���X�^���X���\�b�h���g�p���܂��B<BR> <UL> <LI>add,sub,mult,div</LI><BLOCKQUOTE> �����̃��\�b�h�͐擪(�ō�)�̐�������̌������w��ł��܂��B <CODE><PRE> BigDecimal("2").div(3,12) # 2.0/3.0 => 0.6666666666 67E0 </PRE></CODE> </BLOCKQUOTE> <LI>truncate,round,ceil,floor</LI><BLOCKQUOTE> �����̃��\�b�h�͏����_����̑��Έʒu���w�肵�Č��������肵�܂��B <CODE><PRE> BigDecimal("6.66666666666666").round(12) # => 0.6666666666 667E1 </PRE></CODE> </BLOCKQUOTE> </UL> <H3>�����Ő��x���R���g���[���������ꍇ</H3> �����Ő��x(�L������)���R���g���[���������ꍇ�� add�Asub�Amult�Adiv ���̃��\�b�h ���g�p�ł��܂��B �ȉ��̉~�������v�Z����v���O������̂悤�ɁA ���߂錅���͎����Ŏw�肷�邱�Ƃ��ł��܂��B <BR><BR> <CODE><PRE> #!/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 </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"><shigeo@tinyforest.gr.jp></U></A>) </I> </FONT> </TD> </TR> </TABLE> </BODY> </HTML>