mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
bigdecimal-brushup.patch from Tadashi Saito applied.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
273a14a44c
commit
3f8d7303c1
4 changed files with 41 additions and 46 deletions
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ruby.h"
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -157,7 +157,7 @@ GetVpValue(VALUE v, int must)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case T_FIXNUM:
|
case T_FIXNUM:
|
||||||
sprintf(szD, "%d", NUM2INT(v));
|
sprintf(szD, "%d", FIX2INT(v));
|
||||||
return VpCreateRbObject(VpBaseFig() * 2 + 1, szD);
|
return VpCreateRbObject(VpBaseFig() * 2 + 1, szD);
|
||||||
case T_FLOAT:
|
case T_FLOAT:
|
||||||
pv = VpCreateRbObject(VpDblFig()*2,"0");
|
pv = VpCreateRbObject(VpDblFig()*2,"0");
|
||||||
|
@ -190,7 +190,7 @@ GetVpValue(VALUE v, int must)
|
||||||
}
|
}
|
||||||
return pv;
|
return pv;
|
||||||
case T_STRING:
|
case T_STRING:
|
||||||
Check_SafeStr(v);
|
SafeStringValue(v);
|
||||||
return VpCreateRbObject(strlen(RSTRING(v)->ptr) + VpBaseFig() + 1,
|
return VpCreateRbObject(strlen(RSTRING(v)->ptr) + VpBaseFig() + 1,
|
||||||
RSTRING(v)->ptr);
|
RSTRING(v)->ptr);
|
||||||
case T_BIGNUM:
|
case T_BIGNUM:
|
||||||
|
@ -274,13 +274,12 @@ BigDecimal_load(VALUE self, VALUE str)
|
||||||
{
|
{
|
||||||
ENTER(2);
|
ENTER(2);
|
||||||
Real *pv;
|
Real *pv;
|
||||||
long len;
|
|
||||||
unsigned char *pch;
|
unsigned char *pch;
|
||||||
unsigned char ch;
|
unsigned char ch;
|
||||||
unsigned long m=0;
|
unsigned long m=0;
|
||||||
|
|
||||||
Check_SafeStr(str);
|
SafeStringValue(str);
|
||||||
pch = rb_str2cstr(str, &len);
|
pch = RSTRING(str)->ptr;
|
||||||
/* First get max prec */
|
/* First get max prec */
|
||||||
while((*pch)!=(unsigned char)'\0' && (ch=*pch++)!=(unsigned char)':') {
|
while((*pch)!=(unsigned char)'\0' && (ch=*pch++)!=(unsigned char)':') {
|
||||||
if(ch<'0' || ch>'9') {
|
if(ch<'0' || ch>'9') {
|
||||||
|
@ -304,7 +303,7 @@ BigDecimal_mode(VALUE self, VALUE which, VALUE val)
|
||||||
if(TYPE(which)!=T_FIXNUM) return INT2FIX(fo);
|
if(TYPE(which)!=T_FIXNUM) return INT2FIX(fo);
|
||||||
if(val!=Qfalse && val!=Qtrue) return INT2FIX(fo);
|
if(val!=Qfalse && val!=Qtrue) return INT2FIX(fo);
|
||||||
|
|
||||||
f = (unsigned short)NUM2INT(which);
|
f = (unsigned short)FIX2INT(which);
|
||||||
if(f&VP_EXCEPTION_INFINITY) {
|
if(f&VP_EXCEPTION_INFINITY) {
|
||||||
fo = VpGetException();
|
fo = VpGetException();
|
||||||
VpSetException((unsigned short)((val==Qtrue)?(fo|VP_EXCEPTION_INFINITY):
|
VpSetException((unsigned short)((val==Qtrue)?(fo|VP_EXCEPTION_INFINITY):
|
||||||
|
@ -345,7 +344,7 @@ GetPositiveInt(VALUE v)
|
||||||
{
|
{
|
||||||
S_INT n;
|
S_INT n;
|
||||||
Check_Type(v, T_FIXNUM);
|
Check_Type(v, T_FIXNUM);
|
||||||
n = NUM2INT(v);
|
n = FIX2INT(v);
|
||||||
if(n <= 0) {
|
if(n <= 0) {
|
||||||
rb_fatal("Zero or negative argument not permitted.");
|
rb_fatal("Zero or negative argument not permitted.");
|
||||||
}
|
}
|
||||||
|
@ -824,7 +823,7 @@ BigDecimal_assign2(VALUE self, VALUE n, VALUE f)
|
||||||
Check_Type(f, T_FIXNUM);
|
Check_Type(f, T_FIXNUM);
|
||||||
GUARD_OBJ(cv,VpCreateRbObject(mx,"0"));
|
GUARD_OBJ(cv,VpCreateRbObject(mx,"0"));
|
||||||
GUARD_OBJ(av,GetVpValue(self,1));
|
GUARD_OBJ(av,GetVpValue(self,1));
|
||||||
VpAsgn(cv,av,NUM2INT(f));
|
VpAsgn(cv,av,FIX2INT(f));
|
||||||
return ToValue(cv);
|
return ToValue(cv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -947,7 +946,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
||||||
iLoc = 0;
|
iLoc = 0;
|
||||||
} else {
|
} else {
|
||||||
Check_Type(vLoc, T_FIXNUM);
|
Check_Type(vLoc, T_FIXNUM);
|
||||||
iLoc = NUM2INT(vLoc);
|
iLoc = FIX2INT(vLoc);
|
||||||
}
|
}
|
||||||
sw = 2;
|
sw = 2;
|
||||||
|
|
||||||
|
@ -972,7 +971,7 @@ BigDecimal_truncate(int argc, VALUE *argv, VALUE self)
|
||||||
iLoc = 0;
|
iLoc = 0;
|
||||||
} else {
|
} else {
|
||||||
Check_Type(vLoc, T_FIXNUM);
|
Check_Type(vLoc, T_FIXNUM);
|
||||||
iLoc = NUM2INT(vLoc);
|
iLoc = FIX2INT(vLoc);
|
||||||
}
|
}
|
||||||
sw = 1; /* truncate */
|
sw = 1; /* truncate */
|
||||||
|
|
||||||
|
@ -1010,7 +1009,7 @@ BigDecimal_floor(int argc, VALUE *argv, VALUE self)
|
||||||
iLoc = 0;
|
iLoc = 0;
|
||||||
} else {
|
} else {
|
||||||
Check_Type(vLoc, T_FIXNUM);
|
Check_Type(vLoc, T_FIXNUM);
|
||||||
iLoc = NUM2INT(vLoc);
|
iLoc = FIX2INT(vLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
GUARD_OBJ(a,GetVpValue(self,1));
|
GUARD_OBJ(a,GetVpValue(self,1));
|
||||||
|
@ -1033,7 +1032,7 @@ BigDecimal_ceil(int argc, VALUE *argv, VALUE self)
|
||||||
iLoc = 0;
|
iLoc = 0;
|
||||||
} else {
|
} else {
|
||||||
Check_Type(vLoc, T_FIXNUM);
|
Check_Type(vLoc, T_FIXNUM);
|
||||||
iLoc = NUM2INT(vLoc);
|
iLoc = FIX2INT(vLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
GUARD_OBJ(a,GetVpValue(self,1));
|
GUARD_OBJ(a,GetVpValue(self,1));
|
||||||
|
@ -1056,7 +1055,6 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
||||||
GUARD_OBJ(vp,GetVpValue(self,1));
|
GUARD_OBJ(vp,GetVpValue(self,1));
|
||||||
nc = VpNumOfChars(vp)+1;
|
nc = VpNumOfChars(vp)+1;
|
||||||
if(rb_scan_args(argc,argv,"01",&f)==1) {
|
if(rb_scan_args(argc,argv,"01",&f)==1) {
|
||||||
Check_Type(f, T_FIXNUM);
|
|
||||||
mc = GetPositiveInt(f);
|
mc = GetPositiveInt(f);
|
||||||
nc += (nc + mc - 1) / mc + 1;
|
nc += (nc + mc - 1) / mc + 1;
|
||||||
}
|
}
|
||||||
|
@ -1133,7 +1131,7 @@ BigDecimal_power(VALUE self, VALUE p)
|
||||||
S_LONG mp, ma, n;
|
S_LONG mp, ma, n;
|
||||||
|
|
||||||
Check_Type(p, T_FIXNUM);
|
Check_Type(p, T_FIXNUM);
|
||||||
n = NUM2INT(p);
|
n = FIX2INT(p);
|
||||||
ma = n;
|
ma = n;
|
||||||
if(ma < 0) ma = -ma;
|
if(ma < 0) ma = -ma;
|
||||||
if(ma == 0) ma = 1;
|
if(ma == 0) ma = 1;
|
||||||
|
@ -1163,7 +1161,7 @@ BigDecimal_new(int argc, VALUE *argv, VALUE self)
|
||||||
} else {
|
} else {
|
||||||
mf = GetPositiveInt(nFig);
|
mf = GetPositiveInt(nFig);
|
||||||
}
|
}
|
||||||
Check_SafeStr(iniValue);
|
SafeStringValue(iniValue);
|
||||||
GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING(iniValue)->ptr,self));
|
GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING(iniValue)->ptr,self));
|
||||||
return ToValue(pv);
|
return ToValue(pv);
|
||||||
}
|
}
|
||||||
|
@ -1176,7 +1174,7 @@ BigDecimal_limit(int argc, VALUE *argv, VALUE self)
|
||||||
|
|
||||||
if(rb_scan_args(argc,argv,"01",&nFig)==1) {
|
if(rb_scan_args(argc,argv,"01",&nFig)==1) {
|
||||||
Check_Type(nFig, T_FIXNUM);
|
Check_Type(nFig, T_FIXNUM);
|
||||||
VpSetPrecLimit(NUM2INT(nFig));
|
VpSetPrecLimit(FIX2INT(nFig));
|
||||||
}
|
}
|
||||||
return nCur;
|
return nCur;
|
||||||
}
|
}
|
||||||
|
@ -1195,7 +1193,7 @@ BigDecimal_e(VALUE self, VALUE nFig)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
BigDecimal_pai(VALUE self, VALUE nFig)
|
BigDecimal_pi(VALUE self, VALUE nFig)
|
||||||
{
|
{
|
||||||
ENTER(5);
|
ENTER(5);
|
||||||
Real *pv;
|
Real *pv;
|
||||||
|
@ -1203,7 +1201,7 @@ BigDecimal_pai(VALUE self, VALUE nFig)
|
||||||
|
|
||||||
mf = GetPositiveInt(nFig)+VpBaseFig()-1;
|
mf = GetPositiveInt(nFig)+VpBaseFig()-1;
|
||||||
GUARD_OBJ(pv,VpCreateRbObject(mf, "0"));
|
GUARD_OBJ(pv,VpCreateRbObject(mf, "0"));
|
||||||
VpPai(pv);
|
VpPi(pv);
|
||||||
return ToValue(pv);
|
return ToValue(pv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1293,7 +1291,7 @@ BigDecimal_assign(VALUE self, VALUE c, VALUE a, VALUE f)
|
||||||
Check_Type(f, T_FIXNUM);
|
Check_Type(f, T_FIXNUM);
|
||||||
GUARD_OBJ(cv,GetVpValue(c,1));
|
GUARD_OBJ(cv,GetVpValue(c,1));
|
||||||
GUARD_OBJ(av,GetVpValue(a,1));
|
GUARD_OBJ(av,GetVpValue(a,1));
|
||||||
v = VpAsgn(cv,av,NUM2INT(f));
|
v = VpAsgn(cv,av,FIX2INT(f));
|
||||||
return INT2NUM(v);
|
return INT2NUM(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1364,7 +1362,7 @@ Init_bigdecimal(void)
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "E", BigDecimal_e, 1);
|
rb_define_singleton_method(rb_cBigDecimal, "E", BigDecimal_e, 1);
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "PI", BigDecimal_pai, 1);
|
rb_define_singleton_method(rb_cBigDecimal, "PI", BigDecimal_pi, 1);
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "induced_from",BigDecimal_induced_from, 1);
|
rb_define_singleton_method(rb_cBigDecimal, "induced_from",BigDecimal_induced_from, 1);
|
||||||
rb_define_singleton_method(rb_cBigDecimal, "_load", BigDecimal_load, 1);
|
rb_define_singleton_method(rb_cBigDecimal, "_load", BigDecimal_load, 1);
|
||||||
|
|
||||||
|
@ -3090,7 +3088,7 @@ VpFormatSt(char *psz,S_INT fFmt)
|
||||||
{
|
{
|
||||||
U_LONG ie;
|
U_LONG ie;
|
||||||
U_LONG i, j;
|
U_LONG i, j;
|
||||||
S_INT nf;
|
S_INT nf = 0;
|
||||||
char ch;
|
char ch;
|
||||||
int fDot = 0;
|
int fDot = 0;
|
||||||
|
|
||||||
|
@ -3871,10 +3869,10 @@ Exit:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculates pai(=3.141592653589793238462........).
|
* Calculates pi(=3.141592653589793238462........).
|
||||||
*/
|
*/
|
||||||
VP_EXPORT void
|
VP_EXPORT void
|
||||||
VpPai(Real *y)
|
VpPi(Real *y)
|
||||||
{
|
{
|
||||||
Real *n, *n25, *n956, *n57121;
|
Real *n, *n25, *n956, *n57121;
|
||||||
Real *r, *f, *t;
|
Real *r, *f, *t;
|
||||||
|
@ -3944,7 +3942,7 @@ VpPai(Real *y)
|
||||||
VpFree(f);
|
VpFree(f);
|
||||||
VpFree(r);
|
VpFree(r);
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf("VpPai: # of iterations=%lu+%lu\n",i1,i2);
|
printf("VpPi: # of iterations=%lu+%lu\n",i1,i2);
|
||||||
#endif /* _DEBUG */
|
#endif /* _DEBUG */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4202,7 +4200,7 @@ SkipWhiteChar(char *szVal)
|
||||||
char ch;
|
char ch;
|
||||||
U_LONG i = 0;
|
U_LONG i = 0;
|
||||||
while(ch = szVal[i++]) {
|
while(ch = szVal[i++]) {
|
||||||
if(IsWhiteChar(ch)) continue;
|
if(ISSPACE(ch)) continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return i - 1;
|
return i - 1;
|
||||||
|
|
|
@ -126,7 +126,7 @@ VP_EXPORT int VpSqrt(Real *y,Real *x);
|
||||||
VP_EXPORT void VpRound(Real *y,Real *x,int sw,int f,int il);
|
VP_EXPORT void VpRound(Real *y,Real *x,int sw,int f,int il);
|
||||||
VP_EXPORT void VpFrac(Real *y,Real *x);
|
VP_EXPORT void VpFrac(Real *y,Real *x);
|
||||||
VP_EXPORT int VpPower(Real *y,Real *x,S_INT n);
|
VP_EXPORT int VpPower(Real *y,Real *x,S_INT n);
|
||||||
VP_EXPORT void VpPai(Real *y);
|
VP_EXPORT void VpPi(Real *y);
|
||||||
VP_EXPORT void VpExp1(Real *y);
|
VP_EXPORT void VpExp1(Real *y);
|
||||||
VP_EXPORT void VpExp(Real *y,Real *x);
|
VP_EXPORT void VpExp(Real *y,Real *x);
|
||||||
VP_EXPORT void VpSinCos(Real *psin,Real *pcos,Real *x);
|
VP_EXPORT void VpSinCos(Real *psin,Real *pcos,Real *x);
|
||||||
|
@ -141,8 +141,6 @@ VP_EXPORT int VPrint(FILE *fp,char *cntl_chr,Real *a);
|
||||||
#define Max(a, b) (((a)>(b))?(a):(b))
|
#define Max(a, b) (((a)>(b))?(a):(b))
|
||||||
#define Min(a, b) (((a)>(b))?(b):(a))
|
#define Min(a, b) (((a)>(b))?(b):(a))
|
||||||
|
|
||||||
#define IsWhiteChar(ch) (((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\b'))?1:0)
|
|
||||||
|
|
||||||
#define VpMaxPrec(a) ((a)->MaxPrec)
|
#define VpMaxPrec(a) ((a)->MaxPrec)
|
||||||
#define VpPrec(a) ((a)->Prec)
|
#define VpPrec(a) ((a)->Prec)
|
||||||
#define VpGetFlag(a) ((a)->flag)
|
#define VpGetFlag(a) ((a)->flag)
|
||||||
|
|
|
@ -704,17 +704,17 @@ its dirmeter(pi=3.14159265358979....) using J.Machin's formula.
|
||||||
#!/usr/local/bin/ruby
|
#!/usr/local/bin/ruby
|
||||||
|
|
||||||
#
|
#
|
||||||
# pai.rb
|
# pi.rb
|
||||||
# USAGE: ruby pai.rb n
|
# USAGE: ruby pi.rb n
|
||||||
# where n is the number of digits required.
|
# where n is the number of digits required.
|
||||||
# EX.: ruby pai.rb 1000
|
# EX.: ruby pi.rb 1000
|
||||||
#
|
#
|
||||||
|
|
||||||
require "bigdecimal"
|
require "bigdecimal"
|
||||||
#
|
#
|
||||||
# Calculates 3.1415.... using J. Machin's formula.
|
# Calculates 3.1415.... using J. Machin's formula.
|
||||||
#
|
#
|
||||||
def pai(sig) # sig: Number of significant figures
|
def big_pi(sig) # sig: Number of significant figures
|
||||||
exp = -sig
|
exp = -sig
|
||||||
pi = BigDecimal::new("0")
|
pi = BigDecimal::new("0")
|
||||||
two = BigDecimal::new("2")
|
two = BigDecimal::new("2")
|
||||||
|
@ -746,8 +746,8 @@ def pai(sig) # sig: Number of significant figures
|
||||||
end
|
end
|
||||||
|
|
||||||
if $0 == __FILE__
|
if $0 == __FILE__
|
||||||
print "PAI("+ARGV[0]+"):\n"
|
print "PI("+ARGV[0]+"):\n"
|
||||||
p pai(ARGV[0].to_i)
|
p pi(ARGV[0].to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
</PRE></CODE>
|
</PRE></CODE>
|
||||||
|
|
|
@ -303,12 +303,11 @@ a
|
||||||
<LI>to_f</LI><BR>
|
<LI>to_f</LI><BR>
|
||||||
dup と全く同じです。
|
dup と全く同じです。
|
||||||
同じ値の BigDecimal オブジェクトを生成します。
|
同じ値の BigDecimal オブジェクトを生成します。
|
||||||
<LI>to_s</LI><BR>
|
<LI>to_s[(n)]</LI><BR>
|
||||||
文字列に変換します("0.xxxxxEn"の形になります)。<BR>
|
文字列に変換します("0.xxxxxEn"の形になります)。<BR>
|
||||||
s = a.to_s
|
s = a.to_s<BR>
|
||||||
<LI>to_s2</LI><BR>
|
n が指定されたときは、仮数部分を n 桁毎に空白で区切ります。<BR>
|
||||||
文字列に変換します。仮数部分を n 桁毎に空白で区切ります。<BR>
|
s = a.to_s(n)
|
||||||
s = a.to_s2(n)
|
|
||||||
<LI>exponent</LI><BR>
|
<LI>exponent</LI><BR>
|
||||||
指数部を整数値で返します。
|
指数部を整数値で返します。
|
||||||
n = a.exponent <BR>
|
n = a.exponent <BR>
|
||||||
|
@ -644,17 +643,17 @@ c = a op b
|
||||||
#!/usr/local/bin/ruby
|
#!/usr/local/bin/ruby
|
||||||
|
|
||||||
#
|
#
|
||||||
# pai.rb
|
# pi.rb
|
||||||
# USAGE: ruby pai.rb n
|
# USAGE: ruby pi.rb n
|
||||||
# where n is the number of digits required.
|
# where n is the number of digits required.
|
||||||
# EX.: ruby pai.rb 1000
|
# EX.: ruby pi.rb 1000
|
||||||
#
|
#
|
||||||
|
|
||||||
require "bigdecimal"
|
require "bigdecimal"
|
||||||
#
|
#
|
||||||
# Calculates 3.1415.... using J. Machin's formula.
|
# Calculates 3.1415.... using J. Machin's formula.
|
||||||
#
|
#
|
||||||
def pai(sig) # sig: Number of significant figures
|
def big_pi(sig) # sig: Number of significant figures
|
||||||
exp = -sig
|
exp = -sig
|
||||||
pi = BigDecimal::new("0")
|
pi = BigDecimal::new("0")
|
||||||
two = BigDecimal::new("2")
|
two = BigDecimal::new("2")
|
||||||
|
@ -686,8 +685,8 @@ def pai(sig) # sig: Number of significant figures
|
||||||
end
|
end
|
||||||
|
|
||||||
if $0 == __FILE__
|
if $0 == __FILE__
|
||||||
print "PAI("+ARGV[0]+"):\n"
|
print "PI("+ARGV[0]+"):\n"
|
||||||
p pai(ARGV[0].to_i)
|
p pi(ARGV[0].to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
</PRE></CODE>
|
</PRE></CODE>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue