| Class | ApfpSeries |
| In: |
lib/rapfp/Apfp.rb
|
| Parent: | Object |
# File lib/rapfp/Apfp.rb, line 719
719: def initialize(series_name,x,term,cnt,incr,maxloop,rconst)
720: @series_name = series_name
721: @x = x
722: @sum = ap_int(0)
723: @term = term
724: @cnt = cnt
725: @incr = incr
726: @maxloop = maxloop
727: @@rconst = rconst
728: end
# File lib/rapfp/Apfp.rb, line 730
730: def compute
731: limit = self.limit(@x)
732: if limit < Apfp.new(5,-NUM_DIGITS,1,-NUM_DIGITS) then
733: limit = Apfp.new(5,-NUM_DIGITS,1,-NUM_DIGITS)
734: end
735: @sum = @term
736: while limit < @term.abs && @cnt < @maxloop do
737: @term *= self.fctr
738: @sum = @term + @sum.clone
739: @cnt += @incr
740: # puts @series_name
741: # puts @cnt
742: # @term.display_val("@term")
743: end
744: if @sum.makerr < limit then @sum = @sum.seterr!(limit) end
745: if @sum.makerr < @term then @sum = @sum.seterr!(@term) end
746: return @sum
747: end
# File lib/rapfp/Apfp.rb, line 794
794: def fctr
795:
796: case "#{@series_name}"
797: when "sin","sin_err"
798: return @@rconst.minus_one*@x*@x/ap_int(@cnt+1)/ap_int(@cnt+2)
799: when "cos","cos_err"
800: return @@rconst.minus_one*@x*@x/ap_int(@cnt+1)/ap_int(@cnt+2)
801: when "exp","exp_err"
802: return @x/ap_int(@cnt+1)
803: when "asin"
804: if @cnt == 3 then
805: return @x*@x/ap_int(@cnt-1)/ap_int(@cnt)
806: else
807: return @x*@x*ap_int(@cnt-2)*ap_int(@cnt-2)/ap_int(@cnt-1)/ap_int(@cnt)
808: end
809: when "asin_basic"
810: if @cnt == 3 then
811: return @x*@x/ap_int(@cnt-1)/ap_int(@cnt)
812: else
813: return @x*@x*ap_int(@cnt-2)*ap_int(@cnt-2)/ap_int(@cnt-1)/ap_int(@cnt)
814: end
815: when "erf"
816: if @cnt == 3 then
817: @cnt2 = 1
818: else
819: @cnt2 += 1
820: end
821: return ap_int(-1)*@x*@x*ap_int(@cnt-2)/ap_int(@cnt)/ap_int(@cnt2)
822: when "atan"
823: return ap_int(-1)*@x*@x*ap_int(@cnt-2)/ap_int(@cnt)
824: when "log","log_err"
825: return (@x-ap_int(1))*ap_int(-1)*ap_int(@cnt-1)/ap_int(@cnt)
826: when "log_init"
827: tmp = (@x-ap_int(1))/(@x+ap_int(1))
828: return tmp*tmp*ap_int(@cnt)/ap_int(@cnt+2)
829: # else
830: # puts "Case error"
831: end
832: end
# File lib/rapfp/Apfp.rb, line 749
749: def limit(x)
750: case "#{@series_name}"
751: when "sin"
752: a = x.clone
753: s = ApfpSeriesConst.new("cos_err",a,@@rconst) # deriv of sin is cos
754: return s.compute.abs*a.makerr
755: when "cos_err"
756: a = x.clone
757: return s = a.makerr
758: when "cos"
759: a = x.clone
760: s = ApfpSeriesConst.new("sin_err",a,@@rconst) # deriv of cos is sin
761: return s.compute.abs*a.makerr
762: when "sin_err"
763: a = x.clone
764: return s = a.makerr
765: when "exp"
766: a = x.clone
767: s = ApfpSeriesConst.new("exp_err",a,@@rconst) # deriv of cos is sin
768: return s.compute.abs*a.makerr
769: when "exp_err"
770: a = x.clone
771: return s = a.makerr
772: when "erf"
773: a = x.clone
774: return s = $two/$pi.sqrt_err*((a*a).neg.exp_err)*a.makerr
775: when "asin"
776: if @x.abs == (ap_int(1)) then return @x.makerr end # not sure of this!
777: return @x.makerr / (ap_int(1)-@x*@x).sqrt_err
778: when "asin_basic"
779: if @x.abs == (ap_int(1)) then return @x.makerr end # not sure of this!
780: return @x.makerr / (ap_int(1)-@x*@x).sqrt_err
781: when "atan"
782: return @x.makerr / (ap_int(1)+@x*@x)
783: when "log","log_init","log_err"
784: a = x.clone
785: return a.makerr/a
786: # else
787: # puts "Case error"
788: end
789: end