view scripts/ode/private/kahan.m @ 20584:eb9e2d187ed2

maint: Use Octave coding conventions in scripts/ode/private dir. * AbsRel_Norm.m, fuzzy_compare.m, hermite_quartic_interpolation.m, integrate_adaptive.m, integrate_const.m, integrate_n_steps.m, kahan.m, ode_struct_value_check.m, odepkg_event_handle.m, odepkg_structure_check.m, runge_kutta_45_dorpri.m, starting_stepsize.m: Wrap long lines to < 80 chars. Use double quotes rather than single quotes where possible. Use ';' at end of keywords "return;" and "break;" Use '##" for stand-alone comments and '#' for end-of-line comments. Use two spaces after period before starting new sentence. Use '!' instead of '~' for logical negation. Use specific form of end (endif, endfor, etc.). Don't use line continuation marker '...' unless necessary.
author Rik <rik@octave.org>
date Sun, 04 Oct 2015 22:18:54 -0700
parents 25623ef2ff4f
children
line wrap: on
line source

## Copyright (C) 2013, Roberto Porcu' <roberto.porcu@polimi.it>
##
## This file is part of Octave.
##
## Octave is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or (at
## your option) any later version.
##
## Octave is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, see
## <http://www.gnu.org/licenses/>.

## -*- texinfo -*-
## @deftypefn  {Function File} {@var{sum} =} kahan (@var{sum}, @var{comp}, @var{temp})
## @deftypefnx {Function File} {[@var{sum}, @var{comp}] =} kahan (@var{sum}, @var{comp}, @var{temp})
##
## This function is the implementation of the Kahan summation algorithm,
## also known as compensated summation.
##
## It significantly reduces the numerical error in the total obtained by adding
## a sequence of finite precision floating point numbers, compared to the
## obvious approach.  For more details
## see @url{http://en.wikipedia.org/wiki/Kahan_summation_algorithm}.
## This function is called in @command{integrate_adaptive} and in
## @command{integrate_const} to better catch equality comparisons.
##
## The first input argument is the variable that will contain the summation,
## so that is also returned as first output argument in order to reuse it in
## next calls to kahan function.
##
## The second input argument contains the compensation term and it is returned
## as second output argument so that it can be reused in the next calls of the
## same computation.
##
## The third input argument is the variable that contains the term to be added
## to @var{Sum}.
## @end deftypefn

function [Sum, comp] = kahan (Sum, comp, term)

    y = term - comp;
    t = Sum + y;
    comp = (t - Sum) - y;
    Sum = t;

endfunction