def fadd(self, iterable): '''Accumulate more values from an iterable. @arg iterable: Sequence, list, tuple, etc. (C{scalar}s). @raise OverflowError: Partial C{2sum} overflow. @raise TypeError: Non-scalar B{C{iterable}} value. @raise ValueError: Invalid or non-finite B{C{iterable}} value. ''' if isscalar(iterable): # for backward compatibility iterable = tuple(iterable) ps = self._ps for a in map(float, iterable): # _iter() if not isfinite(a): raise _ValueError(iterable=a, txt=_not_(_finite_)) i = 0 for p in ps: a, p = _2sum(a, p) if p: ps[i] = p i += 1 ps[i:] = [a] self._n += 1 # assert self._ps is ps self._fsum2_ = None
def fpowers(x, n, alts=0): '''Return a series of powers M{[x**i for i=1..n]}. @arg x: Value (C{scalar}). @arg n: Highest exponent (C{int}). @kwarg alts: Only alternating powers, starting with this exponent (C{int}). @return: Powers of B{C{x}} (C{float}[]). @raise TypeError: Non-scalar B{C{x}} or B{C{n}} not C{int}. @raise ValueError: Non-finite B{C{x}} or non-positive B{C{n}}. ''' if not isfinite(x): raise _ValueError(x=x, txt=_not_(_finite_)) if not isint(n): raise _IsnotError(int.__name__, n=n) elif n < 1: raise _ValueError(n=n) xs = [x] for _ in range(1, n): xs.append(xs[-1] * x) if alts > 0: # x**2, x**4, ... # XXX PyChecker chokes on xs[alts-1::2] xs = xs[slice(alts - 1, None, 2)] # XXX PyChecker claims result is None return xs
def __init__(self, x, *cs): '''New L{Fpolynomial} evaluation of the polynomial M{sum(cs[i] * x**i for i=0..len(cs))}. @arg x: Polynomial argument (C{scalar}). @arg cs: Polynomial coeffients (C{scalar}[]). @raise OverflowError: Partial C{2sum} overflow. @raise TypeError: Non-scalar B{C{x}}. @raise ValueError: No B{C{cs}} coefficients or B{C{x}} is not finite. @see: Function L{fpolynomial} and method L{Fsum.fadd}. ''' if not isfinite(x): raise _ValueError(x=x, txt=_not_(_finite_)) if not cs: raise _ValueError(cs=cs, txt=MISSING) x, cs, xp = float(x), list(cs), _1_0 Fsum.__init__(self, cs.pop(0)) while cs: xp *= x self.fadd_(xp * cs.pop(0))
def __init__(self, x, *cs): '''New L{Fhorner} evaluation of the polynomial M{sum(cs[i] * x**i for i=0..len(cs))}. @arg x: Polynomial argument (C{scalar}). @arg cs: Polynomial coeffients (C{scalar}[]). @raise OverflowError: Partial C{2sum} overflow. @raise TypeError: Non-scalar B{C{x}}. @raise ValueError: No B{C{cs}} coefficients or B{C{x}} is not finite. @see: Function L{fhorner} and methods L{Fsum.fadd} and L{Fsum.fmul}. ''' if not isfinite(x): raise _ValueError(x=x, txt=_not_finite_) if not cs: raise _ValueError(cs=cs, txt=_Missing) x, cs = float(x), list(cs) Fsum.__init__(self, cs.pop()) while cs: self.fmul(x) self.fadd_(cs.pop())
def _2sum(a, b): # by .testFmath '''(INTERNAL) Precision C{2sum} of M{a + b}. ''' s = a + b if not isfinite(s): raise _OverflowError(unstr(_2sum.__name__, a, b), txt=str(s)) if abs(a) < abs(b): a, b = b, a return s, b - (s - a)
def _2sum(a, b): '''(INTERNAL) Precision C{2sum} of M{a + b}. ''' s = a + b if not isfinite(s): raise OverflowError('%s: %r' % (_2sum.__name__, s)) if abs(a) < abs(b): a, b = b, a return s, b - (s - a)
def fmul(self, factor): '''Multiple the current, partial sum by a factor. @arg factor: The multiplier (C{scalar}). @raise TypeError: Non-scalar B{C{factor}}. @raise ValueError: Invalid or non-finite B{C{factor}}. @see: Method L{Fsum.fadd}. ''' if not isfinite(factor): raise _ValueError(factor=factor, txt=_not_(_finite_)) f, ps = float(factor), self._ps if ps: # multiply and adjust partial sums ps[:] = [p * f for p in ps] self.fadd_(ps.pop()) self._n -= 1
def fmul(self, factor): '''Multiple the current, partial sum by a factor. @arg factor: The multiplier (C{scalar}). @raise TypeError: Non-scalar B{C{factor}}. @raise ValueError: Invalid or non-finite B{C{factor}}. @see: Method L{Fsum.fadd}. ''' if not isfinite(factor): raise ValueError('%s, not %s: %r' % (self, 'finite', factor)) ps = self._ps if ps: # multiply and adjust partial sums ps[:] = [p * factor for p in ps] self.fadd_(ps.pop()) self._n -= 1
def fadd(self, iterable): '''Accumulate more values from an iterable. @arg iterable: Sequence, list, tuple, etc. (C{scalar}s). @raise OverflowError: Partial C{2sum} overflow. @raise TypeError: Non-scalar B{C{iterable}} value. @raise ValueError: Invalid or non-finite B{C{iterable}} value. ''' if isscalar(iterable): # for backward compatibility iterable = tuple(iterable) # def _iter(): # for a in iterable: # if isinstance(a, Fsum): # if a is self: # self.fmul(2) # else: # for a in a._ps: # yield a # else: # yield a ps = self._ps for a in iterable: # _iter() if not isfinite(a): raise ValueError('%s, not %s: %r' % (self, 'finite', a)) i = 0 for p in ps: a, p = _2sum(a, p) if p: ps[i] = p i += 1 ps[i:] = [a] self._n += 1 # assert self._ps is ps self._fsum2_ = None