Class ApfpSeries
In: lib/rapfp/Apfp.rb
Parent: Object

Methods

compute   fctr   limit   new  

Public Class methods

[Source]

     # 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

Public Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Validate]