diff options
Diffstat (limited to 'gsl-1.9/doc/gsl-design.texi')
-rw-r--r-- | gsl-1.9/doc/gsl-design.texi | 1610 |
1 files changed, 1610 insertions, 0 deletions
diff --git a/gsl-1.9/doc/gsl-design.texi b/gsl-1.9/doc/gsl-design.texi new file mode 100644 index 0000000..7e513ef --- /dev/null +++ b/gsl-1.9/doc/gsl-design.texi @@ -0,0 +1,1610 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename gsl-design.info +@settitle GNU Scientific Library +@finalout +@c -@setchapternewpage odd +@c %**end of header + +@dircategory Scientific software +@direntry +* GSL-design: (GSL-design). GNU Scientific Library -- Design +@end direntry + +@comment @include version-design.texi +@set GSL @i{GNU Scientific Library} + +@ifinfo +This file documents the @value{GSL}. + +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2004 The GSL Project. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A +copy of the license is included in the section entitled ``GNU Free +Documentation License''. +@end ifinfo + +@titlepage +@title GNU Scientific Library -- Design document +@comment @subtitle Edition @value{EDITION}, for gsl Version @value{VERSION} +@comment @subtitle @value{UPDATED} +@author Mark Galassi +Los Alamos National Laboratory + +@author James Theiler +Astrophysics and Radiation Measurements Group, Los Alamos National Laboratory + +@author Brian Gough +Network Theory Limited + +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1996,1997,1998,1999,2000,2001,2004 The GSL Project. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Foundation. +@end titlepage + +@contents + +@node Top, Motivation, (dir), (dir) +@top About GSL + +@ifinfo +This file documents the design of @value{GSL}, a collection of numerical +routines for scientific computing. + +More information about GSL can be found at the project homepage, +@uref{http://www.gnu.org/software/gsl/}. +@end ifinfo + +The @value{GSL} is a library of scientific subroutines. It aims to +provide a convenient interface to routines that do standard (and not so +standard) tasks that arise in scientific research. More than that, it +also provides the source code. Users are welcome to alter, adjust, +modify, and improve the interfaces and/or implementations of whichever +routines might be needed for a particular purpose. + +GSL is intended to provide a free equivalent to existing proprietary +numerical libraries written in C or Fortran, such as NAG, IMSL's CNL, +IBM's ESSL, and SGI's SCSL. + +The target platform is a low-end desktop workstation. The goal is to +provide something which is generally useful, and the library is aimed at +general users rather than specialists. + +@menu +* Motivation:: +* Contributing:: +* Design:: +* Bibliography:: +* Copying:: +* GNU Free Documentation License:: +@end menu + +@node Motivation, Contributing, Top, Top +@chapter Motivation +@cindex numerical analysis +@cindex free software + +There is a need for scientists and engineers to have a numerical library +that: +@itemize @bullet +@item +is free (in the sense of freedom, not in the sense of gratis; see the +GNU General Public License), so that people can use that library, +redistribute it, modify it @dots{} +@item +is written in C using modern coding conventions, calling conventions, +scoping @dots{} +@item +is clearly and pedagogically documented; preferably with TeXinfo, so as +to allow online info, WWW and TeX output. +@item +uses top quality state-of-the-art algorithms. +@item +is portable and configurable using @emph{autoconf} and @emph{automake}. +@item +basically, is GNUlitically correct. +@end itemize + +There are strengths and weaknesses with existing libraries: + +@emph{Netlib} (http://www.netlib.org/) is probably the most advanced set +of numerical algorithms available on the net, maintained by AT&T. +Unfortunately most of the software is written in Fortran, with strange +calling conventions in many places. It is also not very well collected, +so it is a lot of work to get started with netlib. + +@emph{GAMS} (http://gams.nist.gov/) is an extremely well organized set +of pointers to scientific software, but like netlib, the individual +routines vary in their quality and their level of documentation. + +@emph{Numerical Recipes} (http://www.nr.com, +http://cfata2.harvard.edu/nr/) is an excellent book: it explains the +algorithms in a very clear way. Unfortunately the authors released the +source code under a license which allows you to use it, but prevents you +from re-distributing it. Thus Numerical Recipes is not @emph{free} in +the sense of @emph{freedom}. On top of that, the implementation suffers +from @emph{fortranitis} and other +limitations. [http://www.lysator.liu.se/c/num-recipes-in-c.html] + +@emph{SLATEC} is a large public domain collection of numerical routines +in Fortran written under a Department of Energy program in the +1970's. The routines are well tested and have a reasonable overall +design (given the limitations of that era). GSL should aim to be a +modern version of SLATEC. + +@emph{NSWC} is the Naval Surface Warfare Center numerical library. It +is a large public-domain Fortran library, containing a lot of +high-quality code. Documentation for the library is hard to find, only +a few photocopies of the printed manual are still in circulation. + +@emph{NAG} and @emph{IMSL} both sell high-quality libraries which are +proprietary. The NAG library is more advanced and has wider scope than +IMSL. The IMSL library leans more towards ease-of-use and makes +extensive use of variable length argument lists to emulate "default +arguments". + +@emph{ESSL} and @emph{SCSL} are proprietary libraries from IBM and SGI. + +@emph{Forth Scientific Library} [see the URL +http://www.taygeta.com/fsl/sciforth.html]. Mainly of interest to Forth +users. + +@emph{Numerical Algorithms with C} G. Engeln-Mullges, F. Uhlig. A nice +numerical library written in ANSI C with an accompanying +textbook. Source code is available but the library is not free software. + +@emph{NUMAL} A C version of the NUMAL library has been written by +H.T. Lau and is published as a book and disk with the title "A Numerical +Library in C for Scientists and Engineers". Source code is available but +the library is not free software. + +@emph{C Mathematical Function Handbook} by Louis Baker. A library of +function approximations and methods corresponding to those in the +"Handbook of Mathematical Functions" by Abramowitz and Stegun. Source +code is available but the library is not free software. + +@emph{CCMATH} by Daniel A. Atkinson. A C numerical library covering +similar areas to GSL. The code is quite terse. Earlier versions were +under the GPL but unfortunately it has changed to the LGPL in recent +versions. + +@emph{CEPHES} A useful collection of high-quality special functions +written in C. Not GPL'ed. + +@emph{WNLIB} A small collection of numerical routines written in C by +Will Naylor. Public domain. + +@emph{MESHACH} A comprehensive matrix-vector linear algebra library +written in C. Freely available but not GPL'ed (non-commercial license). + +@emph{CERNLIB} is a large high-quality Fortran library developed at CERN +over many years. It was originally non-free software but has recently +been released under the GPL. + +@emph{COLT} is a free numerical library in Java developed at CERN by +Wolfgang Hoschek. It is under a BSD-style license. + +The long-term goal will be to provide a framework to which the real +numerical experts (or their graduate students) will contribute. + +@node Contributing, Design, Motivation, Top +@chapter Contributing + +This design document was originally written in 1996. As of 2004, GSL +itself is essentially feature complete, the developers are not actively +working on any major new functionality. + +The main emphasis is now on ensuring the stability of the existing +functions, improving consistency, tidying up a few problem areas and +fixing any bugs that are reported. Potential contributors are +encouraged to gain familiarity with the library by investigating and +fixing known problems listed in the @file{BUGS} file in the CVS +repository. + +Adding large amounts of new code is difficult because it leads to +differences in the maturity of different parts of the library. To +maintain stability, any new functionality is encouraged as +@dfn{packages}, built on top of GSL and maintained independently by the +author, as in other free software projects (such as the Perl CPAN +archive and TeX CTAN archive, etc). + +@menu +* Packages:: +@end menu + +@node Packages, , Contributing, Contributing +@section Packages + +The design of GSL permits extensions to be used alongside the existing +library easily by simple linking. For example, additional random number +generators can be provided in a separate library: + +@example +$ tar xvfz rngextra-0.1.tar.gz +$ cd rngextra-0.1 +$ ./configure; make; make check; make install +$ ... +$ gcc -Wall main.c -lrngextra -lgsl -lgslcblas -lm +@end example + +The points below summarise the package design guidelines. These are +intended to ensure that packages are consistent with GSL itself, to make +life easier for the end-user and make it possible to distribute popular +well-tested packages as part of the core GSL in future. + +@itemize @bullet +@item Follow the GSL and GNU coding standards described in this document + +This means using the standard GNU packaging tools, such as Automake, +providing documentation in Texinfo format, and a test suite. The test +suite should run using @samp{make check}, and use the test functions +provided in GSL to produce the output with @code{PASS:}/@code{FAIL:} +lines. It is not essential to use libtool since packages are likely to +be small, a static library is sufficient and simpler to build. + +@item Use a new unique prefix for the package (do not use @samp{gsl_} -- this is reserved for internal use). + +For example, a package of additional random number generators might use +the prefix @code{rngextra}. + +@example +#include <rngextra.h> + +gsl_rng * r = gsl_rng_alloc (rngextra_lsfr32); +@end example + +@item Use a meaningful version number which reflects the state of development + +Generally, @code{0.x} are alpha versions, which provide no guarantees. +Following that, @code{0.9.x} are beta versions, which should be essentially +complete, subject only to minor changes and bug fixes. The first major +release is @code{1.0}. Any version number of @code{1.0} or higher +should be suitable for production use with a well-defined API. + +The API must not change in a major release and should be +backwards-compatible in its behavior (excluding actual bug-fixes), so +that existing code do not have to be modified. Note that the API +includes all exported definitions, including data-structures defined +with @code{struct}. If you need to change the API in a package, it +requires a new major release (e.g. @code{2.0}). + +@item Use the GNU General Public License (GPL) + +Follow the normal procedures of obtaining a copyright disclaimer if you +would like to have the package considered for inclusion in GSL itself in +the future (@pxref{Legal issues}). +@end itemize + +Post announcements of your package releases to +@email{gsl-discuss@@sources.redhat.com} so that information about them +can be added to the GSL webpages. + +For security, sign your package with GPG (@code{gpg --detach-sign +@var{file}}). + +An example package @samp{rngextra} containing two additional random +number generators can be found at +@url{http://www.network-theory.co.uk/download/rngextra/}. + +@node Design, Bibliography, Contributing, Top +@chapter Design + +@menu +* Language for implementation:: +* Interface to other languages:: +* What routines are implemented:: +* What routines are not implemented:: +* Design of Numerical Libraries:: +* Code Reuse:: +* Standards and conventions:: +* Background and Preparation:: +* Choice of Algorithms:: +* Documentation:: +* Namespace:: +* Header files:: +* Target system:: +* Function Names:: +* Object-orientation:: +* Comments:: +* Minimal structs:: +* Algorithm decomposition:: +* Memory allocation and ownership:: +* Memory layout:: +* Linear Algebra Levels:: +* Error estimates:: +* Exceptions and Error handling:: +* Persistence:: +* Using Return Values:: +* Variable Names:: +* Datatype widths:: +* size_t:: +* Arrays vs Pointers:: +* Pointers:: +* Constness:: +* Pseudo-templates:: +* Arbitrary Constants:: +* Test suites:: +* Compilation:: +* Thread-safety:: +* Legal issues:: +* Non-UNIX portability:: +* Compatibility with other libraries:: +* Parallelism:: +* Precision:: +* Miscellaneous:: +@end menu + +@node Language for implementation, Interface to other languages, Design, Design +@section Language for implementation + +@strong{One language only (C)} + +Advantages: simpler, compiler available and quite universal. + +@node Interface to other languages, What routines are implemented, Language for implementation, Design +@section Interface to other languages + +Wrapper packages are supplied as "extra" packages; not as part of the +"core". They are maintained separately by independent contributors. + +Use standard tools to make wrappers: swig, g-wrap + +@node What routines are implemented, What routines are not implemented, Interface to other languages, Design +@section What routines are implemented + +Anything which is in any of the existing libraries. Obviously it makes +sense to prioritize and write code for the most important areas first. + +@c @itemize @bullet +@c @item Random number generators + +@c Includes both random number generators and routines to give various +@c interesting distributions. + +@c @item Statistics + +@c @item Special Functions + +@c What I (jt) envision for this section is a collection of routines for +@c reliable and accurate (but not necessarily fast or efficient) estimation +@c of values for special functions, explicitly using Taylor series, asymptotic +@c expansions, continued fraction expansions, etc. As well as these routines, +@c fast approximations will also be provided, primarily based on Chebyschev +@c polynomials and ratios of polynomials. In this vision, the approximations +@c will be the "standard" routines for the users, and the exact (so-called) +@c routines will be used for verification of the approximations. It may also +@c be useful to provide various identity-checking routines as part of the +@c verification suite. + +@c @item Curve fitting + +@c polynomial, special functions, spline + +@c @item Ordinary differential equations + +@c @item Partial differential equations + +@c @item Fourier Analysis + +@c @item Wavelets + +@c @item Matrix operations: linear equations + +@c @item Matrix operations: eigenvalues and spectral analysis + +@c @item Matrix operations: any others? + +@c @item Direct integration + +@c @item Monte carlo methods + +@c @item Simulated annealing + +@c @item Genetic algorithms + +@c We need to think about what kinds of algorithms are basic generally +@c useful numerical algorithms, and which ones are special purpose +@c research projects. We should concentrate on supplying the former. + +@c @item Cellular automata + +@c @end itemize + +@node What routines are not implemented, Design of Numerical Libraries, What routines are implemented, Design +@section What routines are not implemented + +@itemize @bullet +@item anything which already exists as a high-quality GPL'ed package. + +@item anything which is too big + -- i.e. an application in its own right rather than a subroutine + +For example, partial differential equation solvers are often huge and +very specialized applications (since there are so many types of PDEs, +types of solution, types of grid, etc). This sort of thing should +remain separate. It is better to point people to the good applications +which exist. + +@item anything which is independent and useful separately. + +Arguably functions for manipulating date and time, or financial +functions might be included in a "scientific" library. However, these +sorts of modules could equally well be used independently in other +programs, so it makes sense for them to be separate libraries. +@end itemize + +@node Design of Numerical Libraries, Code Reuse, What routines are not implemented, Design +@section Design of Numerical Libraries + +In writing a numerical library there is a unavoidable conflict between +completeness and simplicity. Completeness refers to the ability to +perform operations on different objects so that the group is +"closed". In mathematics objects can be combined and operated on in an +infinite number of ways. For example, I can take the derivative of a +scalar field with respect to a vector and the derivative of a vector +field wrt a scalar (along a path). + +There is a definite tendency to unconsciously try to reproduce all these +possibilities in a numerical library, by adding new features one by +one. After all, it is always easy enough to support just one more +feature.... so why not? + +Looking at the big picture, no-one would start out by saying "I want to +be able to represent every possible mathematical object and operation +using C structs" -- this is a strategy which is doomed to fail. There +is a limited amount of complexity which can be represented in a +programming language like C. Attempts to reproduce the complexity of +mathematics within such a language would just lead to a morass of +unmaintainable code. However, it's easy to go down that road if you +don't think about it ahead of time. + +It is better to choose simplicity over completeness. In designing new +parts of the library keep modules independent where possible. If +interdependencies between modules are introduced be sure about where you +are going to draw the line. + +@node Code Reuse, Standards and conventions, Design of Numerical Libraries, Design +@section Code Reuse + +It is useful if people can grab a single source file and include it in +their own programs without needing the whole library. Try to allow +standalone files like this whenever it is reasonable. Obviously the +user might need to define a few macros, such as GSL_ERROR, to compile +the file but that is ok. Examples where this can be done: grabbing a +single random number generator. + +@node Standards and conventions, Background and Preparation, Code Reuse, Design +@section Standards and conventions + +The people who kick off this project should set the coding standards and +conventions. In order of precedence the standards that we follow are, + +@itemize @bullet +@item We follow the GNU Coding Standards. +@item We follow the conventions of the ANSI Standard C Library. +@item We follow the conventions of the GNU C Library. +@item We follow the conventions of the glib GTK support Library. +@end itemize + +The references for these standards are the @cite{GNU Coding Standards} +document, Harbison and Steele @cite{C: A Reference Manual}, the +@cite{GNU C Library Manual} (version 2), and the Glib source code. + +For mathematical formulas, always follow the conventions in Abramowitz & +Stegun, the @cite{Handbook of Mathematical Functions}, since it is the +definitive reference and also in the public domain. + +If the project has a philosophy it is to "Think in C". Since we are +working in C we should only do what is natural in C, rather than trying +to simulate features of other languages. If there is something which is +unnatural in C and has to be simulated then we avoid using it. If this +means leaving something out of the library, or only offering a limited +version then so be it. It is not worthwhile making the library +over-complicated. There are numerical libraries in other languages, and +if people need the features of those languages it would be sensible for +them to use the corresponding libraries, rather than coercing a C +library into doing that job. + +It should be borne in mind at all time that C is a macro-assembler. If +you are in doubt about something being too complicated ask yourself the +question "Would I try to write this in macro-assembler?" If the answer +is obviously "No" then do not try to include it in GSL. [BJG] + +It will be useful to read the following papers, + +@itemize @asis +@item +Kiem-Phong Vo, ``The Discipline and Method Architecture for Reusable +Libraries'', Software - Practice & Experience, v.30, pp.107-128, 2000. +@end itemize + +@noindent +It is available from +@uref{http://www.research.att.com/sw/tools/sfio/dm-spe.ps} or the earlier +technical report Kiem-Phong Vo, "An Architecture for Reusable Libraries" +@uref{http://citeseer.nj.nec.com/48973.html}. + +There are associated papers on Vmalloc, SFIO, and CDT which are also +relevant to the design of portable C libraries. + +@itemize @asis +@item +Kiem-Phong Vo, ``Vmalloc: A General and Efficient Memory +Allocator''. Software Practice & Experience, 26:1--18, 1996. + +@uref{http://www.research.att.com/sw/tools/vmalloc/vmalloc.ps} +@item +Kiem-Phong Vo. ``Cdt: A Container Data Type Library''. Soft. Prac. & +Exp., 27:1177--1197, 1997 + +@uref{http://www.research.att.com/sw/tools/cdt/cdt.ps} +@item +David G. Korn and Kiem-Phong Vo, ``Sfio: Safe/Fast String/File IO'', +Proceedings of the Summer '91 Usenix Conference, pp. 235-256, 1991. + +@uref{http://citeseer.nj.nec.com/korn91sfio.html} +@end itemize + +Source code should be indented according to the GNU Coding Standards, +with spaces not tabs. For example, by using the @code{indent} command: + +@example +indent -gnu -nut *.c *.h +@end example + +@noindent +The @code{-nut} option converts tabs into spaces. + +@node Background and Preparation, Choice of Algorithms, Standards and conventions, Design +@section Background and Preparation + +Before implementing something be sure to research the subject +thoroughly! This will save a lot of time in the long-run. The two most +important steps are, + +@enumerate +@item +to determine whether there is already a free library (GPL or +GPL-compatible) which does the job. If so, there is no need to +reimplement it. Carry out a search on Netlib, GAMs, na-net, +sci.math.num-analysis and the web in general. This should also provide +you with a list of existing proprietary libraries which are relevant, +keep a note of these for future reference in step 2. + +@item +make a comparative survey of existing implementations in the +commercial/free libraries. Examine the typical APIs, methods of +communication between program and subroutine, and classify them so that +you are familiar with the key concepts or features that an +implementation may or may not have, depending on the relevant tradeoffs +chosen. Be sure to review the documentation of existing libraries for +useful references. + +@item +read up on the subject and determine the state-of-the-art. Find the +latest review papers. A search of the following journals should be +undertaken. + +@itemize @asis +@item ACM Transactions on Mathematical Software +@item Numerische Mathematik +@item Journal of Computation and Applied Mathematics +@item Computer Physics Communications +@item SIAM Journal of Numerical Analysis +@item SIAM Journal of Scientific Computing +@end itemize +@end enumerate + +@noindent +Keep in mind that GSL is not a research project. Making a good +implementation is difficult enough, without also needing to invent new +algorithms. We want to implement existing algorithms whenever +possible. Making minor improvements is ok, but don't let it be a +time-sink. + +@node Choice of Algorithms, Documentation, Background and Preparation, Design +@section Choice of Algorithms + +Whenever possible choose algorithms which scale well and always remember +to handle asymptotic cases. This is particularly relevant for functions +with integer arguments. It is tempting to implement these using the +simple @math{O(n)} algorithms used to define the functions, such as the +many recurrence relations found in Abramowitz and Stegun. While such +methods might be acceptable for @math{n=O(10-100)} they will not be +satisfactory for a user who needs to compute the same function for +@math{n=1000000}. + +Similarly, do not make the implicit assumption that multivariate data +has been scaled to have components of the same size or O(1). Algorithms +should take care of any necessary scaling or balancing internally, and +use appropriate norms (e.g. |Dx| where D is a diagonal scaling matrix, +rather than |x|). + +@node Documentation, Namespace, Choice of Algorithms, Design +@section Documentation +Documentation: the project leaders should give examples of how things +are to be documented. High quality documentation is absolutely +mandatory, so documentation should introduce the topic, and give careful +reference for the provided functions. The priority is to provide +reference documentation for each function. It is not necessary to +provide tutorial documentation. + +Use free software, such as GNU Plotutils, to produce the graphs in the +manual. + +Some of the graphs have been made with gnuplot which is not truly free +(or GNU) software, and some have been made with proprietary +programs. These should be replaced with output from GNU plotutils. + +When citing references be sure to use the standard, definitive and +best reference books in the field, rather than lesser known text-books +or introductory books which happen to be available (e.g. from +undergraduate studies). For example, references concerning algorithms +should be to Knuth, references concerning statistics should be to +Kendall & Stuart, references concerning special functions should be to +Abramowitz & Stegun (Handbook of Mathematical Functions AMS-55), etc. +Whereever possible refer to Abramowitz & Stegun rather than other +reference books because it is a public domain work, so it is +inexpensive and freely redistributable. + +The standard references have a better chance of being available in an +accessible library for the user. If they are not available and the user +decides to buy a copy in order to look up the reference then this also +gives them the best quality book which should also cover the largest +number of other references in the GSL Manual. If many different books +were to be referenced this would be an expensive and inefficient use of +resources for a user who needs to look up the details of the algorithms. +Reference books also stay in print much longer than text books, which +are often out-of-print after a few years. + +Similarly, cite original papers wherever possible. Be sure to keep +copies of these for your own reference (e.g. when dealing with bug +reports) or to pass on to future maintainers. + +If you need help in tracking down references, ask on the +@code{gsl-discuss} mailing list. There is a group of volunteers with +access to good libraries who have offered to help GSL developers get +copies of papers. + +@c [JT section: written by James Theiler + +@c And we furthermore promise to try as hard as possible to document +@c the software: this will ideally involve discussion of why you might want +@c to use it, what precisely it does, how precisely to invoke it, +@c how more-or-less it works, and where we learned about the algorithm, +@c and (unless we wrote it from scratch) where we got the code. +@c We do not plan to write this entire package from scratch, but to cannibalize +@c existing mathematical freeware, just as we expect our own software to +@c be cannibalized.] + +To write mathematics in the texinfo file you can use the @code{@@math} +command with @emph{simple} TeX commands. These are automatically +surrounded by @code{$...$} for math mode. For example, + +@example +to calculate the coefficient @@math@{\alpha@} use the function... +@end example + +@noindent +will be correctly formatted in both online and TeX versions of the +documentation. + +Note that you cannot use the special characters @{ and @} +inside the @code{@@math} command because these conflict between TeX +and Texinfo. This is a problem if you want to write something like +@code{\sqrt@{x+y@}}. + +To work around it you can preceed the math command with a special +macro @code{@@c} which contains the explicit TeX commands you want to +use (no restrictions), and put an ASCII approximation into the +@code{@@math} command (you can write @code{@@@{} and +@code{@@@}} there for the left and right braces). The explicit TeX +commands are used in the TeX ouput and the argument of @code{@@math} +in the plain info output. + +Note that the @code{@@c@{@}} macro must go at the end of the +preceeding line, because everything else after it is ignored---as far +as texinfo is concerned it's actually a 'comment'. The comment +command @@c has been modified to capture a TeX expression which is +output by the next @@math command. For ordinary comments use the @@comment +command. + +For example, + +@example +this is a test @@c@{$\sqrt@{x+y@}$@} +@@math@{\sqrt@@@{x+y@@@}@} +@end example + +@noindent +is equivalent to @code{this is a test $\sqrt@{x+y@}$} in plain TeX +and @code{this is a test @@math@{\sqrt@@@{x+y@@@}@}} in Info. + +It looks nicer if some of the more cryptic TeX commands are given +a C-style ascii version, e.g. + +@example +for @@c@{$x \ge y$@} +@@math@{x >= y@} +@end example + +@noindent +will be appropriately displayed in both TeX and Info. + + +@node Namespace, Header files, Documentation, Design +@section Namespace + +Use @code{gsl_} as a prefix for all exported functions and variables. + +Use @code{GSL_} as a prefix for all exported macros. + +All exported header files should have a filename with the prefix @code{gsl_}. + +All installed libraries should have a name like libgslhistogram.a + +Any installed executables (utility programs etc) should have the prefix +@code{gsl-} (with a hyphen, not an underscore). + +All function names, variables, etc should be in lower case. Macros and +preprocessor variables should be in upper case. + +Some common conventions in variable and function names: + +@table @code +@item p1 +plus 1, e.g. function @code{log1p(x)} or a variable like @code{kp1}, @math{=k+1}. + +@item m1 +minus 1, e.g. function @code{expm1(x)} or a variable like @code{km1}, @math{=k-1}. +@end table + +@node Header files, Target system, Namespace, Design +@section Header files + +Installed header files should be idempotent, i.e. surround them by the +preprocessor conditionals like the following, + +@example +#ifndef __GSL_HISTOGRAM_H__ +#define __GSL_HISTOGRAM_H__ +... +#endif /* __GSL_HISTOGRAM_H__ */ +@end example + +@node Target system, Function Names, Header files, Design +@section Target system + +The target system is ANSI C, with a full Standard C Library, and IEEE +arithmetic. + +@node Function Names, Object-orientation, Target system, Design +@section Function Names + +Each module has a name, which prefixes any function names in that +module, e.g. the module gsl_fft has function names like +gsl_fft_init. The modules correspond to subdirectories of the library +source tree. + +@node Object-orientation, Comments, Function Names, Design +@section Object-orientation + +The algorithms should be object oriented, but only to the extent that is +easy in portable ANSI C. The use of casting or other tricks to simulate +inheritance is not desirable, and the user should not have to be aware +of anything like that. This means many types of patterns are ruled +out. However, this is not considered a problem -- they are too +complicated for the library. + +Note: it is possible to define an abstract base class easily in C, using +function pointers. See the rng directory for an example. + +When reimplementing public domain fortran code, please try to introduce +the appropriate object concepts as structs, rather than translating the +code literally in terms of arrays. The structs can be useful just +within the file, you don't need to export them to the user. + +For example, if a fortran program repeatedly uses a subroutine like, + +@example +SUBROUTINE RESIZE (X, K, ND, K1) +@end example + +@noindent +where X(K,D) represents a grid to be resized to X(K1,D) you can make +this more readable by introducing a struct, + +@smallexample +struct grid @{ + int nd; /* number of dimensions */ + int k; /* number of bins */ + double * x; /* partition of axes, array of size x[k][nd] */ +@} + +void +resize_grid (struct grid * g, int k_new) +@{ +... +@} +@end smallexample + +@noindent +Similarly, if you have a frequently recurring code fragment within a +single file you can define a static or static inline function for it. +This is typesafe and saves writing out everything in full. + + +@node Comments, Minimal structs, Object-orientation, Design +@section Comments + +Follow the GNU Coding Standards. A relevant quote is, + +``Please write complete sentences and capitalize the first word. If a +lower-case identifier comes at the beginning of a sentence, don't +capitalize it! Changing the spelling makes it a different identifier. +If you don't like starting a sentence with a lower case letter, write +the sentence differently (e.g., "The identifier lower-case is ...").'' + +@node Minimal structs, Algorithm decomposition, Comments, Design +@section Minimal structs + +We prefer to make structs which are @dfn{minimal}. For example, if a +certain type of problem can be solved by several classes of algorithm +(e.g. with and without derivative information) it is better to make +separate types of struct to handle those cases. i.e. run time type +identification is not desirable. + +@node Algorithm decomposition, Memory allocation and ownership, Minimal structs, Design +@section Algorithm decomposition + +Iterative algorithms should be decomposed into an INITIALIZE, ITERATE, +TEST form, so that the user can control the progress of the iteration +and print out intermediate results. This is better than using +call-backs or using flags to control whether the function prints out +intermediate results. In fact, call-backs should not be used -- if they +seem necessary then it's a sign that the algorithm should be broken down +further into individual components so that the user has complete control +over them. + +For example, when solving a differential equation the user may need to +be able to advance the solution by individual steps, while tracking a +realtime process. This is only possible if the algorithm is broken down +into step-level components. Higher level decompositions would not give +sufficient flexibility. + +@node Memory allocation and ownership, Memory layout, Algorithm decomposition, Design +@section Memory allocation and ownership + +Functions which allocate memory on the heap should end in _alloc +(e.g. gsl_foo_alloc) and be deallocated by a corresponding _free function +(gsl_foo_free). + +Be sure to free any memory allocated by your function if you have to +return an error in a partially initialized object. + +Don't allocate memory 'temporarily' inside a function and then free it +before the function returns. This prevents the user from controlling +memory allocation. All memory should be allocated and freed through +separate functions and passed around as a "workspace" argument. This +allows memory allocation to be factored out of tight loops. + +@node Memory layout, Linear Algebra Levels, Memory allocation and ownership, Design +@section Memory layout + +We use flat blocks of memory to store matrices and vectors, not C-style +pointer-to-pointer arrays. The matrices are stored in row-major order +-- i.e. the column index (second index) moves continuously through memory. + +@node Linear Algebra Levels, Error estimates, Memory layout, Design +@section Linear Algebra Levels + +Functions using linear algebra are divided into two levels: + +For purely "1d" functions we use the C-style arguments (double *, +stride, size) so that it is simpler to use the functions in a normal C +program, without needing to invoke all the gsl_vector machinery. + +The philosophy here is to minimize the learning curve. If someone only +needs to use one function, like an fft, they can do so without having +to learn about gsl_vector. + +This leads to the question of why we don't do the same for matrices. +In that case the argument list gets too long and confusing, with +(size1, size2, tda) for each matrix and potential ambiguities over row +vs column ordering. In this case, it makes sense to use gsl_vector and +gsl_matrix, which take care of this for the user. + +So really the library has two levels -- a lower level based on C types +for 1d operations, and a higher level based on gsl_matrix and +gsl_vector for general linear algebra. + +Of course, it would be possible to define a vector version of the +lower level functions too. So far we have not done that because it was +not essential -- it could be done but it is easy enough to get by +using the C arguments, by typing v->data, v->stride, v->size instead. +A gsl_vector version of low-level functions would mainly be a +convenience. + +Please use BLAS routines internally within the library whenever possible +for efficiency. + +@node Error estimates, Exceptions and Error handling, Linear Algebra Levels, Design +@section Error estimates + +In the special functions error bounds are given as twice the expected +``gaussian'' error. i.e. 2-sigma, so the result is inside the error +98% of the time. People expect the true value to be within +/- the +quoted error (this wouldn't be the case 32% of the time for 1 sigma). +Obviously the errors are not gaussian but a factor of two works well +in practice. + +@node Exceptions and Error handling, Persistence, Error estimates, Design +@section Exceptions and Error handling + +The basic error handling procedure is the return code (see gsl_errno.h +for a list of allowed values). Use the GSL_ERROR macro to mark an +error. The current definition of this macro is not ideal but it can be +changed at compile time. + +You should always use the GSL_ERROR macro to indicate an error, rather +than just returning an error code. The macro allows the user to trap +errors using the debugger (by setting a breakpoint on the function +gsl_error). + +The only circumstances where GSL_ERROR should not be used are where the +return value is "indicative" rather than an error -- for example, the +iterative routines use the return code to indicate the success or +failure of an iteration. By the nature of an iterative algorithm +"failure" (a return code of GSL_CONTINUE) is a normal occurrence and +there is no need to use GSL_ERROR there. + +Be sure to free any memory allocated by your function if you return an +error (in particular for errors in partially initialized objects). + +@node Persistence, Using Return Values, Exceptions and Error handling, Design +@section Persistence + +If you make an object foo which uses blocks of memory (e.g. vector, +matrix, histogram) you can provide functions for reading and writing +those blocks, + +@smallexample +int gsl_foo_fread (FILE * stream, gsl_foo * v); +int gsl_foo_fwrite (FILE * stream, const gsl_foo * v); +int gsl_foo_fscanf (FILE * stream, gsl_foo * v); +int gsl_foo_fprintf (FILE * stream, const gsl_foo * v, const char *format); +@end smallexample + +@noindent +Only dump out the blocks of memory, not any associated parameters such +as lengths. The idea is for the user to build higher level input/output +facilities using the functions the library provides. The fprintf/fscanf +versions should be portable between architectures, while the binary +versions should be the "raw" version of the data. Use the functions + +@smallexample +int gsl_block_fread (FILE * stream, gsl_block * b); +int gsl_block_fwrite (FILE * stream, const gsl_block * b); +int gsl_block_fscanf (FILE * stream, gsl_block * b); +int gsl_block_fprintf (FILE * stream, const gsl_block * b, const char *format); +@end smallexample + +@noindent +or + +@smallexample +int gsl_block_raw_fread (FILE * stream, double * b, size_t n, size_t stride); +int gsl_block_raw_fwrite (FILE * stream, const double * b, size_t n, size_t stri +de); +int gsl_block_raw_fscanf (FILE * stream, double * b, size_t n, size_t stride); +int gsl_block_raw_fprintf (FILE * stream, const double * b, size_t n, size_t str +ide, const char *format); +@end smallexample + +@noindent +to do the actual reading and writing. + +@node Using Return Values, Variable Names, Persistence, Design +@section Using Return Values + +Always assign a return value to a variable before using it. This allows +easier debugging of the function, and inspection and modification of the +return value. If the variable is only needed temporarily then enclose +it in a suitable scope. + +For example, instead of writing, + +@example +a = f(g(h(x,y))) +@end example + +@noindent +use temporary variables to store the intermediate values, +@example +@{ + double u = h(x,y); + double v = g(u); + a = f(v); +@} +@end example + +@noindent +These can then be inspected more easily in the debugger, and breakpoints +can be placed more precisely. The compiler will eliminate the temporary +variables automatically when the program is compiled with optimization. + +@node Variable Names, Datatype widths, Using Return Values, Design +@section Variable Names + +Try to follow existing conventions for variable names, + +@table @code +@item dim +number of dimensions +@item w +pointer to workspace +@item state +pointer to state variable (use @code{s} if you need to save characters) +@item result +pointer to result (output variable) +@item abserr +absolute error +@item relerr +relative error +@item epsabs +absolute tolerance +@item epsrel +relative tolerance +@item size +the size of an array or vector e.g. double array[size] +@item stride +the stride of a vector +@item size1 +the number of rows in a matrix +@item size2 +the number of columns in a matrix +@item n +general integer number, e.g. number of elements of array, in fft, etc +@item r +random number generator (gsl_rng) +@end table + +@node Datatype widths, size_t, Variable Names, Design +@section Datatype widths + +Be aware that in ANSI C the type @code{int} is only guaranteed to +provide 16-bits. It may provide more, but is not guaranteed to. +Therefore if you require 32 bits you must use @code{long int}, which +will have 32 bits or more. Of course, on many platforms the type +@code{int} does have 32 bits instead of 16 bits but we have to code to +the ANSI standard rather than a specific platform. + +@node size_t, Arrays vs Pointers, Datatype widths, Design +@section size_t + +All objects (blocks of memory, etc) should be measured in terms of a +@code{size_t} type. Therefore any iterations (e.g. @code{for(i=0; i<N; +i++)}) should also use an index of type @code{size_t}. + +Don't mix @code{int} and @code{size_t}. They are @emph{not} +interchangeable. + +If you need to write a descending loop you have to be careful because +@code{size_t} is unsigned, so instead of + +@example +for (i = N - 1; i >= 0; i--) @{ ... @} /* DOESN'T WORK */ +@end example + +@noindent +use something like + +@example +for (i = N; i > 0 && i--;) @{ ... @} +@end example + +@noindent +to avoid problems with wrap-around at @code{i=0}. + +If you really want to avoid confusion use a separate variable to invert +the loop order, +@example +for (i = 0; i < N; i++) @{ j = N - i; ... @} +@end example + +@node Arrays vs Pointers, Pointers, size_t, Design +@section Arrays vs Pointers + +A function can be declared with either pointer arguments or array +arguments. The C standard considers these to be equivalent. However, it +is useful to distinguish between the case of a pointer, representing a +single object which is being modified, and an array which represents a +set of objects with unit stride (that are modified or not depending on +the presence of @code{const}). For vectors, where the stride is not +required to be unity, the pointer form is preferred. + +@smallexample +/* real value, set on output */ +int foo (double * x); + +/* real vector, modified */ +int foo (double * x, size_t stride, size_t n); + +/* constant real vector */ +int foo (const double * x, size_t stride, size_t n); + +/* real array, modified */ +int bar (double x[], size_t n); + +/* real array, not modified */ +int baz (const double x[], size_t n); +@end smallexample + +@node Pointers, Constness, Arrays vs Pointers, Design +@section Pointers + +Avoid dereferencing pointers on the right-hand side of an expression where +possible. It's better to introduce a temporary variable. This is +easier for the compiler to optimise and also more readable since it +avoids confusion between the use of @code{*} for multiplication and +dereferencing. + +@example +while (fabs (f) < 0.5) +@{ + *e = *e - 1; + f *= 2; +@} +@end example + +@noindent +is better written as, + +@example +@{ + int p = *e; + + while (fabs(f) < 0.5) + @{ + p--; + f *= 2; + @} + + *e = p; +@} +@end example + +@node Constness, Pseudo-templates, Pointers, Design +@section Constness + +Use @code{const} in function prototypes wherever an object pointed to by +a pointer is constant (obviously). For variables which are meaningfully +constant within a function/scope use @code{const} also. This prevents +you from accidentally modifying a variable which should be constant +(e.g. length of an array, etc). It can also help the compiler do +optimization. These comments also apply to arguments passed by value +which should be made @code{const} when that is meaningful. + +@node Pseudo-templates, Arbitrary Constants, Constness, Design +@section Pseudo-templates + +There are some pseudo-template macros available in @file{templates_on.h} +and @file{templates_off.h}. See a directory link @file{block} for +details on how to use them. Use sparingly, they are a bit of a +nightmare, but unavoidable in places. + +In particular, the convention is: templates are used for operations on +"data" only (vectors, matrices, statistics, sorting). This is intended +to cover the case where the program must interface with an external +data-source which produces a fixed type. e.g. a big array of char's +produced by an 8-bit counter. + +All other functions can use double, for floating point, or the +appropriate integer type for integers (e.g. unsigned long int for random +numbers). It is not the intention to provide a fully templated version +of the library. + +That would be "putting a quart into a pint pot". To summarize, almost +everything should be in a "natural type" which is appropriate for +typical usage, and templates are there to handle a few cases where it is +unavoidable that other data-types will be encountered. + +For floating point work "double" is considered a "natural type". This +sort of idea is a part of the C language. + +@node Arbitrary Constants, Test suites, Pseudo-templates, Design +@section Arbitrary Constants + +Avoid arbitrary constants. + +For example, don't hard code "small" values like '1e-30', '1e-100' or +@code{10*GSL_DBL_EPSILON} into the routines. This is not appropriate +for a general purpose library. + +Compute values accurately using IEEE arithmetic. If errors are +potentially significant then error terms should be estimated reliably +and returned to the user, by analytically deriving an error propagation +formula, not using guesswork. + +A careful consideration of the algorithm usually shows that arbitrary +constants are unnecessary, and represent an important parameter which +should be accessible to the user. + +For example, consider the following code: + +@example +if (residual < 1e-30) @{ + return 0.0; /* residual is zero within round-off error */ +@} +@end example + +@noindent +This should be rewritten as, + +@example + return residual; +@end example + +@noindent +in order to allow the user to determine whether the residual is +significant or not. + +The only place where it is acceptable to use constants like +@code{GSL_DBL_EPSILON} is in function approximations, (e.g. taylor +series, asymptotic expansions, etc). In these cases it is not an +arbitrary constant, but an inherent part of the algorithm. + +@node Test suites, Compilation, Arbitrary Constants, Design +@section Test suites + +The implementor of each module should provide a reasonable test suite +for the routines. + +The test suite should be a program that uses the library and checks the +result against known results, or invokes the library several times and +does a statistical analysis on the results (for example in the case of +random number generators). + +Ideally the one test program per directory should aim for 100% path +coverage of the code. Obviously it would be a lot of work to really +achieve this, so prioritize testing on the critical parts and use +inspection for the rest. Test all the error conditions by explicitly +provoking them, because we consider it a serious defect if the function +does not return an error for an invalid parameter. N.B. Don't bother to +test for null pointers -- it's sufficient for the library to segfault if +the user provides an invalid pointer. + +The tests should be deterministic. Use the @code{gsl_test} functions +provided to perform separate tests for each feature with a separate +output PASS/FAIL line, so that any failure can be uniquely identified. + +Use realistic test cases with 'high entropy'. Tests on simple values +such as 1 or 0 may not reveal bugs. For example, a test using a value +of @math{x=1} will not pick up a missing factor of @math{x} in the code. +Similarly, a test using a value of @math{x=0} will not pick any missing +terms involving @math{x} in the code. Use values like @math{2.385} to +avoid silent failures. + +If your test uses multiple values make sure there are no simple +relations between them that could allow bugs to be missed through silent +cancellations. + +If you need some random floats to put in the test programs use @code{od -f +/dev/random} as a source of inspiration. + +Don't use @code{sprintf} to create output strings in the tests. It can +cause hard to find bugs in the test programs themselves. The functions +@code{gsl_test_...} support format string arguments so use these +instead. + +@node Compilation, Thread-safety, Test suites, Design +@section Compilation + +Make sure everything compiles cleanly. Use the strict compilation +options for extra checking. + +@smallexample +make CFLAGS="-ansi -pedantic -Werror -W -Wall -Wtraditional -Wconversion + -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings + -Wstrict-prototypes -fshort-enums -fno-common -Wmissing-prototypes + -Wnested-externs -Dinline= -g -O4" +@end smallexample + +@noindent +Also use @code{checkergcc} to check for memory problems on the stack and +the heap. It's the best memory checking tool. If checkergcc isn't +available then Electric Fence will check the heap, which is better than +no checking. + +There is a new tool @code{valgrind} for checking memory access. Test +the code with this as well. + +Make sure that the library will also compile with C++ compilers +(g++). This should not be too much of a problem if you have been writing +in ANSI C. + +@node Thread-safety, Legal issues, Compilation, Design +@section Thread-safety + +The library should be usable in thread-safe programs. All the functions +should be thread-safe, in the sense that they shouldn't use static +variables. + +We don't require everything to be completely thread safe, but anything +that isn't should be obvious. For example, some global variables are +used to control the overall behavior of the library (range-checking +on/off, function to call on fatal error, etc). Since these are accessed +directly by the user it is obvious to the multi-threaded programmer that +they shouldn't be modified by different threads. + +There is no need to provide any explicit support for threads +(e.g. locking mechanisms etc), just to avoid anything which would make +it impossible for someone to call a GSL routine from a multithreaded +program. + + +@node Legal issues, Non-UNIX portability, Thread-safety, Design +@section Legal issues + +@itemize @bullet +@item +Each contributor must make sure her code is under the GNU General Public +License (GPL). This means getting a disclaimer from your employer. +@item +We must clearly understand ownership of existing code and algorithms. +@item +Each contributor can retain ownership of their code, or sign it over to +FSF as they prefer. + +There is a standard disclaimer in the GPL (take a look at it). The more +specific you make your disclaimer the more likely it is that it will be +accepted by an employer. For example, + +@smallexample +Yoyodyne, Inc., hereby disclaims all copyright interest in the software +`GNU Scientific Library - Legendre Functions' (routines for computing +legendre functions numerically in C) written by James Hacker. + +<signature of Ty Coon>, 1 April 1989 +Ty Coon, President of Vice +@end smallexample + +@item +Obviously: don't use or translate non-free code. + +In particular don't copy or translate code from @cite{Numerical Recipes} +or @cite{ACM TOMS}. + +Numerical Recipes is under a strict license and is not free software. +The publishers Cambridge University Press claim copyright on all aspects +of the book and the code, including function names, variable names and +ordering of mathematical subexpressions. Routines in GSL should not +refer to Numerical Recipes or be based on it in any way. + +The ACM algorithms published in TOMS (Transactions on Mathematical +Software) are not public domain, even though they are distributed on the +internet -- the ACM uses a special non-commercial license which is not +compatible with the GPL. The details of this license can be found on the +cover page of ACM Transactions on Mathematical Software or on the ACM +Website. + +Only use code which is explicitly under a free license: GPL or Public +Domain. If there is no license on the code then this does not mean it +is public domain -- an explicit statement is required. If in doubt check +with the author. + +@item +I @strong{think} one can reference algorithms from classic books on +numerical analysis (BJG: yes, provided the code is an independent +implementation and not copied from any existing software. For +example, it would be ok to read the papers in ACM TOMS and make an +independent implementation from their description). +@end itemize + +@node Non-UNIX portability, Compatibility with other libraries, Legal issues, Design +@section Non-UNIX portability + +There is good reason to make this library work on non-UNIX systems. It +is probably safe to ignore DOS and only worry about windows95/windowsNT +portability (so filenames can be long, I think). + +On the other hand, nobody should be forced to use non-UNIX systems for +development. + +The best solution is probably to issue guidelines for portability, like +saying "don't use XYZ unless you absolutely have to". Then the Windows +people will be able to do their porting. + +@node Compatibility with other libraries, Parallelism, Non-UNIX portability, Design +@section Compatibility with other libraries + +We do not regard compatibility with other numerical libraries as a +priority. + +However, other libraries, such as Numerical Recipes, are widely used. +If somebody writes the code to allow drop-in replacement of these +libraries it would be useful to people. If it is done, it would be as a +separate wrapper that can be maintained and shipped separately. + +There is a separate issue of system libraries, such as BSD math library +and functions like @code{expm1}, @code{log1p}, @code{hypot}. The +functions in this library are available on nearly every platform (but +not all). + +In this case, it is best to write code in terms of these native +functions to take advantage of the vendor-supplied system library (for +example log1p is a machine instruction on the Intel x86). The library +also provides portable implementations e.g. @code{gsl_hypot} which are +used as an automatic fall back via autoconf when necessary. See the +usage of @code{hypot} in @file{gsl/complex/math.c}, the implementation +of @code{gsl_hypot} and the corresponding parts of files +@file{configure.in} and @file{config.h.in} as an example. + +@node Parallelism, Precision, Compatibility with other libraries, Design +@section Parallelism + +We don't intend to provide support for parallelism within the library +itself. A parallel library would require a completely different design +and would carry overhead that other applications do not need. + +@node Precision, Miscellaneous, Parallelism, Design +@section Precision + +For algorithms which use cutoffs or other precision-related terms please +express these in terms of @code{GSL_DBL_EPSILON} and @code{GSL_DBL_MIN}, or powers or +combinations of these. This makes it easier to port the routines to +different precisions. + +@node Miscellaneous, , Precision, Design +@section Miscellaneous + +Don't use the letter @code{l} as a variable name --- it is difficult to +distinguish from the number @code{1}. (This seems to be a favorite in +old Fortran programs). + +Final tip: one perfect routine is better than any number of routines +containing errors. + +@node Bibliography, Copying, Design, Top +@chapter Bibliography + +@section General numerics + +@itemize + +@item +@cite{Numerical Computation} (2 Volumes) by C.W. Ueberhuber, +Springer 1997, ISBN 3540620583 (Vol 1) and ISBN 3540620575 (Vol 2). + +@item +@cite{Accuracy and Stability of Numerical Algorithms} by N.J. Higham, +SIAM, ISBN 0898715210. + +@item +@cite{Sources and Development of Mathematical Software} edited by W.R. Cowell, +Prentice Hall, ISBN 0138235015. + +@item +@cite{A Survey of Numerical Mathematics (2 vols)} by D.M. Young and R.T. Gregory, + ISBN 0486656918, ISBN 0486656926. + +@item +@cite{Methods and Programs for Mathematical Functions} by Stephen L. Moshier, +Hard to find (ISBN 13578980X or 0135789982, possibly others). + +@item +@cite{Numerical Methods That Work} by Forman S. Acton, + ISBN 0883854503. + +@item +@cite{Real Computing Made Real: Preventing Errors in Scientific and Engineering Calculations} by Forman S. Acton, + ISBN 0486442217. +@end itemize + +@section Reference + +@itemize +@item +@cite{Handbook of Mathematical Functions} edited by Abramowitz & Stegun, +Dover, ISBN 0486612724. + +@item +@cite{The Art of Computer Programming} (3rd Edition, 3 Volumes) by D. Knuth, +Addison Wesley, ISBN 0201485419. +@end itemize + +@section Subject specific + +@itemize +@item +@cite{Matrix Computations} (3rd Ed) by G.H. Golub, C.F. Van Loan, +Johns Hopkins University Press 1996, ISBN 0801854148. + +@item +@cite{LAPACK Users' Guide} (3rd Edition), +SIAM 1999, ISBN 0898714478. + +@item +@cite{Treatise on the Theory of Bessel Functions 2ND Edition} by G N Watson, + ISBN 0521483913. + +@item +@cite{Higher Transcendental Functions satisfying nonhomogenous linear differential equations} by A W Babister, + ISBN 1114401773. + +@end itemize + +@node Copying, GNU Free Documentation License, Bibliography, Top +@unnumbered Copying + + The subroutines and source code in the @value{GSL} package are "free"; +this means that everyone is free to use them and free to redistribute +them on a free basis. The @value{GSL}-related programs are not in the +public domain; they are copyrighted and there are restrictions on their +distribution, but these restrictions are designed to permit everything +that a good cooperating citizen would want to do. What is not allowed +is to try to prevent others from further sharing any version of these +programs that they might get from you. + + Specifically, we want to make sure that you have the right to give +away copies of the programs that relate to @value{GSL}, that you receive +source code or else can get it if you want it, that you can change these +programs or use pieces of them in new free programs, and that you know +you can do these things. + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of the @value{GSL}-related code, you must give the recipients all +the rights that you have. You must make sure that they, too, receive or +can get the source code. And you must tell them their rights. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for the programs that relate to +@value{GSL}. If these programs are modified by someone else and passed +on, we want their recipients to know that what they have is not what we +distributed, so that any problems introduced by others will not reflect +on our reputation. + + The precise conditions of the licenses for the programs currently +being distributed that relate to @value{GSL} are found in the General +Public Licenses that accompany them. + +@node GNU Free Documentation License, , Copying, Top +@unnumbered GNU Free Documentation License +@include fdl.texi + +@c @printindex cp + +@c @node Function Index +@c @unnumbered Function Index + +@c @printindex fn + +@c @node Variable Index +@c @unnumbered Variable Index + +@c @printindex vr + +@c @node Type Index +@c @unnumbered Type Index + +@c @printindex tp + +@bye |