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