lib/nio/repdec.rb in nio-0.2.3 vs lib/nio/repdec.rb in nio-0.2.4
- old
+ new
@@ -46,13 +46,13 @@
private
def set_case(ch_code)
ch_code = ch_code.chr if ch_code.kind_of?(Numeric)
@dncase ? ch_code.downcase[0] : ch_code.upcase[0]
end
- end
-
+ end
+
# RepDec handles repeating decimals (repeating numerals actually)
class RepDec
include StateEquivalent
class Opt # :nodoc:
@@ -74,11 +74,11 @@
@digits = DigitsDef.new
@digits_defined = false
@max_d = 5000
- end
+ end
attr_accessor :begin_rep, :end_rep, :auto_rep, :dec_sep, :grp_sep, :grp, :max_d
attr_accessor :nan_txt, :inf_txt
def set_delim(begin_d,end_d='')
@begin_rep = begin_d
@@ -103,11 +103,11 @@
@inf_txt = inf_txt
return self
end
def set_digits(ds, dncase=false, casesens=false)
- if ds
+ if ds
@digits_defined = true
if ds.kind_of?(DigitsDef)
@digits = ds
elsif ds.kind_of?(Numeric)
@digits = DigitsDef.base(ds, dncase, casesens)
@@ -142,22 +142,22 @@
@sign = 0;
@radix = b;
self
end
- def setS(str, opt=DEF_OPT)
+ def setS(str, opt=DEF_OPT)
setZ(opt.digits_defined? ? opt.digits.radix : @radix);
sgn,i_str,f_str,ri,detect_rep = RepDec.parse(str,opt)
if i_str.kind_of?(Symbol)
@ip = i_str
else
@ip = i_str.to_i(@radix); # this assumes conventional digits
end
@sign = sgn
@rep_i = ri if ri
f_str.each_byte{|b| @d.push opt.digits.digit_value(b)} unless f_str.nil?
-
+
if detect_rep then
for l in 1..(@d.length/2)
l = @d.length/2 + 1 - l;
if @d[-l..-1]==@d[-2*l...-l]
@@ -167,46 +167,46 @@
reduce_l = true;
for i in 2..l/m
if @d[-m..-1]!=@d[-i*m...-i*m+m] then
reduce_l = false;
break;
- end
+ end
end
if reduce_l then
l = m
break
- end
+ end
end
end
-
+
@rep_i = @d.length - 2*l;
l.times { @d.pop }
- while @d.length >= 2*l && @d[-l..-1]==@d[-2*l...-l]
+ while @d.length >= 2*l && @d[-l..-1]==@d[-2*l...-l]
@rep_i = @d.length - 2*l;
l.times { @d.pop }
end
-
+
break
end
- end
+ end
end
if @rep_i!=nil then
if @d.length==@rep_i+1 && @d[@rep_i]==0 then
@rep_i = nil;
@d.pop;
- end
+ end
end
@d.pop while @d[@d.length-1]==0
-
+
self
end
def RepDec.parse(str, opt=DEF_OPT)
sgn,i_str,f_str,ri,detect_rep = nil,nil,nil,nil,nil
@@ -246,11 +246,11 @@
sgn = neg ? -1 : +1
i += 1; # skip the decimal separator
end
unless i_str.kind_of?(Symbol)
- j = 0;
+ j = 0;
f_str = ''
while i<l
ch = str[i,1];
if ch==opt.begin_rep then
ri = j;
@@ -299,21 +299,21 @@
check = RepDec.new;
check.setS s+opt.auto_rep, opt;
#print " s=",s,"\n"
#print " self=",self.to_s,"\n"
- while check!=self
+ while check!=self
for i in @rep_i...@d.length
- s << opt.digits.digit_char(@d[i])
+ s << opt.digits.digit_char(@d[i])
end
check.setS s+opt.auto_rep, opt;
end
s += opt.auto_rep;
end
else
- s += opt.end_rep if @rep_i!=nil;
+ s += opt.end_rep if @rep_i!=nil;
end
return s;
end
def to_s()
@@ -335,11 +335,11 @@
carry = 1;
@d[i]=0;
@d.pop if i==@d.length;
end
i -= 1;
- end
+ end
@ip += carry;
end
if @rep_i!=nil && @rep_i>=@d.length
@@ -422,14 +422,14 @@
if @rep_i.nil? then
k[x] = i;
x *= @radix
d,x = x.divmod(y)
@d.push d
- i += 1;
+ i += 1;
end
end
- self
+ self
end
def getQ(opt=DEF_OPT)
raise RepDecError,"Base mismatch: #{opt.digits.radix} when #{@radix} was expected." if opt.digits_defined? && @radix!=opt.digits.radix
@@ -440,11 +440,11 @@
x=-1 if ip==:neginfinity
return x,y;
end if
- n = @d.length
+ n = @d.length
a = @ip
b = a
for i in 0...n
a*=@radix
a+=@d[i];
@@ -461,47 +461,47 @@
y -= @radix**@rep_i if @rep_i!=nil
d = Nio.gcd(x,y)
x /= d
y /= d
-
+
x = -x if @sign<0
-
- return x,y;
+
+ return x,y;
end
#protected
attr_reader :d, :ip, :rep_i, :sign;
attr_writer :d, :ip, :rep_i, :sign;
-
- end
+ end
+
def RepDec.group_digits(digits, opt)
if opt.grp_sep!=nil && opt.grp_sep!='' && opt.grp.length>0
- grouped = ''
+ grouped = ''
i = 0
- while digits.length>0
+ while digits.length>0
l = opt.grp[i]
l = digits.length if l>digits.length
grouped = opt.grp_sep + grouped if grouped.length>0
grouped = digits[-l,l] + grouped
digits = digits[0,digits.length-l]
i += 1 if i<opt.grp.length-1
end
grouped
else
digits
- end
+ end
end
module_function
def gcd(a,b)
while b!=0 do
a,b = b, a.modulo(b)
end
- return a.abs;
+ return a.abs;
end
end