* What is new in gsl-1.9:

** Fixed the elliptic integrals F,E,P,D so that they have the correct
behavior for phi > pi/2 and phi < 0.  The angular argument is now
valid for all phi.  Also added the complete elliptic integral
gsl_sf_ellint_Pcomp.

** Added a new BFGS minimisation method gsl_multimin_fdfminimizer_vector_bfgs2
based on the algorithm given by R.Fletcher in "Practical Methods of
Optimisation" (Second edition).  This requires substantially fewer
function and gradient evaluations, and supercedes the existing BFGS
minimiser.

** The beta functions gsl_sf_beta_e(a,b) and gsl_sf_lnbeta_e(a,b) now
handle negative arguments a,b.  Added new function gsl_sf_lnbeta_sgn_e
for computing magnitude and sign of negative beta values, analagous to
gsl_sf_lngamma_sgn_e.

** gsl_cheb_eval_mode now uses the same error estimate as
gsl_cheb_eval_err.

** Improved gsl_sf_legendre_sphPlm_e to avoid underflow with large
arguments.

** Added updated Knuth generator, gsl_rng_knuthran2002, from 9th
printing of "The Art of Computer Programming".  Fixes various
weaknesses in the earlier version gsl_rng_knuthran.  See
http://www-cs-faculty.stanford.edu/~knuth/news02.htm

** The functions gsl_multifit_fsolver_set, gsl_multifit_fdfsolver_set
and gsl_multiroot_fsolver_set, gsl_multiroot_fdfsolver_set now have a
const qualifier for the input vector x, reflecting their actual usage.

** gsl_sf_expint_E2(x) now returns the correct value 1 for x==0,
instead of NaN.

** The gsl_ran_gamma function now uses the Marsaglia-Tsang fast gamma
method of gsl_ran_gamma_mt by default.

** The matrix and vector min/max functions now always propagate any
NaNs in their input.

** Prevented NaN occuring for extreme parameters in
gsl_cdf_fdist_{P,Q}inv and gsl_cdf_beta_{P,Q}inv

** Corrected error estimates for the angular reduction functions
gsl_sf_angle_restrict_symm_err and gsl_sf_angle_restrict_pos_err.
Fixed gsl_sf_angle_restrict_pos to avoid possibility of returning
small negative values.  Errors are now reported for out of range
negative arguments as well as positive.  These functions now return
NaN when there would be significant loss of precision.

** Corrected an error in the higher digits of M_PI_4 (this was beyond
the limit of double precision, so double precision results are not
affected).

** gsl_root_test_delta now always returns success if two iterates are
the same, x1==x0.

** A Japanese translation of the reference manual is now available
from the GSL webpage at http://www.gnu.org/software/gsl/ thanks to
Daisuke TOMINAGA.

** Added new functions for basis splines, see the "Basis Splines"
chapter in the GSL Reference Manual for details.

** Added new functions for testing the sign of vectors and matrices,
gsl_vector_ispos, gsl_vector_isneg, gsl_matrix_ispos and
gsl_matrix_isneg.

** Fixed a bug in gsl_sf_lnpoch_e and gsl_sf_lnpoch_sgn_e which caused
the incorrect value 1.0 instead of 0.0 to be returned for x==0.

** Fixed cancellation error in gsl_sf_laguerre_n for n > 1e7 so that
larger arguments can be calculated without loss of precision.

** Improved gsl_sf_zeta_e to return exactly zero for negative even
integers, avoiding less accurate trigonometric reduction.

** Fixed a bug in gsl_sf_zetam1_int_e where 0 was returned instead of
-1 for negative even integer arguments.

** When the differential equation solver gsl_odeiv_apply encounters a
singularity it returns the step-size which caused the error code from
the user-defined function, as opposed to leaving the step-size
unchanged.

** Added support for nonsymmetric eigensystems

** Added Mathieu functions

* What was new in gsl-1.8:

** Added an error check to trap multifit calls with fewer observations
than parameters.  Previously calling the multifit routines with n<p
would cause invalid memory access.

** Added the Debye unit to physical constants.

** Added cumulative distribution functions for the discrete
distributions, including binomial, poisson, geometric, negative
binomial, pascal and hypergeometric.

** Added the functions gsl_cdf_beta_{Pinv,Qinv} and
gsl_cdf_fdist_{Pinv,Qinv} for computing the inverse of the cumulative
beta and F distributions.

** Added the multilinear fit estimator function gsl_multifit_linear_est
for computing model values and their errors.

** Avoid division by zero in gsl_multimin_fdfminimizer_vector_bfgs
if the step-size becomes too small.

** Users on DEC Alpha systems will need to specify their desired IEEE
arithmetic options via CFLAGS when building the library, as these are
no longer added automatically.

** Added new random variate generators gsl_ran_gaussian_ziggurat
and gsl_ran_gamma_mt for the Gaussian and Gamma distributions based on
the Marsaglia-Tsang ziggurat and fast gamma methods.

** Improved the speed of the exponential power distribution
gsl_ran_exppow.

** Improved the speed of the Gaussian ratio method by adding quadratic
bounds in gsl_ran_gaussian_ratio_method.

** Added an extra term to the taylor series of the synchrotron
functions gsl_sf_synchrotron_1 and gsl_sf_synchrotron_2 for small x to
ensure smooth matching with the chebyshev expansion.

** The binomial pdf gsl_ran_binomial_pdf now handles the cases p=0
and p=1 and is more accurate for the case of small p with k=0.

** Fixed the spherical bessel function gsl_sf_bessel_jl_e) to limit
the use of gsl_sf_bessel_Jnu_asympx_e to the range x>100*l*l to
satisfy he requirement x>>l*l in the asymptotic expansion.

** The scaled bessel function gsl_sf_bessel_In_scaled now handles
larger arguments x > 1e7 correctly for n < 150 using the uniform
asymptotic expansion instead of the continued fraction expansion.

** The functions gsl_stats_min/max now return NaN if the data contains
NaN. Similarly, the functions gsl_stats_min/max_index return the index
of the first occurring NaN in the data when it contains a NaN.

** Fixed an invalid memory access that caused incorrect results for
the special case in periodic cubic spline interpolation of 3 points.

** Added Debye functions for n=5 and n=6

** Added the missing functions gsl_spline_name() and
gsl_spline_min_size()

** The function gsl_rng_uniform_int(r,n) now returns an error for n=0,
which can occur when passing an unsigned integer value of 2^32.

* What was new in gsl-1.7:

** Switched gsl_randist_binomial to use the faster binomial random
variate TPE algorithm by default.  The previous binomial variate
algorithm is available as gsl_randist_binomial_knuth.  This will
result in a different sequence of binomial variates in programs using
this function.

** Improved the algorithm for gsl_sf_elljac_e to avoid cancellation
errors near quarter periods.

** Fixed the branch selection in gsl_sf_gamma_inc_Q_e to avoid
inaccurate results for large a,x where x~=~a.

** The multilinear fitting functions now have forms which accept a
user-specified tolerance for the SVD cutoff and return the
corresponding effective rank of the design matrix.

** The quadratic solvers in poly/ now handle linear equations
gracefully (i.e. quadratrics with a leading coefficient of zero).

** The output of "make check" now only shows test failures by default,
to reduce the amount of output.  Set the environment variable
GSL_TEST_VERBOSE=1 to display all the output.  To assist debugging,
the test number of each failure is shown in square brackets at the
line-end [NNNN].

** Fixed bugs in gsl_linalg_SV_decomp_jacobi which caused
incorrect results for some input matrices.

** Bessel, coulomb, dilogarithm and legendre_H3d functions now use
hypot internally to avoid overflow when computing terms like
sqrt(1+x*x).

** The 'Usage' chapter of the reference manual now explains how to
handle deprecated functions using the GSL_DISABLE_DEPRECATED macro.

** The conflicting enum definitions for 'forward' and 'backward' in
gsl_ftt.h and gsl_wavelet.h are deprecated.  User code should switch
to the new definitions gsl_fft_forward, gsl_fft_backward,
gsl_wavelet_forward and gsl_wavelet_backward. Selectively define
GSL_DISABLE_DEPRECATED before including the headers to use the new
definitions on either or both modules.

** Fixed an error in the the brent minimisation algorithm.  Iterations
should now follow Brent's original description correctly.

** The bound coulomb function gsl_sf_hydrogenicR_e no longer reports
an underflow for exact zeroes of the wavefunction.

** gsl_linalg_SV_decomp_jacobi now reports an error for the
unimplemented case M<N correctly.

** Fixed conformance test for the SYRK and HERK blas functions
gsl_blas_{s,d,c,z}syrk and gsl_blas_{c,z}herk for non-square matrices.

** Configure now checks for presence of ieeefp.h if needed.

** Differential equation solvers now propagate error codes returned
from user-defined functions to the top-level in all cases.

** Sort functions now avoid an infinite loop if Nans are present in
the input vector.  The order of nans in the output is undefined,
although other elements will be sorted correctly.

* What was new in gsl-1.6:

** Added a new wavelet directory, with 1-dimensional and 2-dimensional
discrete wavelet transforms.

** Added support for LQ and P^T LQ decompositions.  To find the QR
decomposition of large systems (M>>N) use the LQ decomposition,
solving the transpose of the original system.  This allows more
efficient memory access, and is useful for solving large least-squares
problems.

** Fixed a bug in the SYRK and HERK blas functions gsl_blas_{s,d,c,z}syrk 
and gsl_blas_{c,z}herk which caused invalid memory access for non-square 
matrices.

** Fixed a bug in gsl_swap_vectors which caused it to return incorrect
results when swapping vectors with different strides.

** Corrected the error estimate for gsl_cheb_eval_n_err to use
evaluation order instead of the approximation order.

** Improved the reliability of the gsl_sf_gamma_inc family of
functions.

** Equal abscissae are now handled gracefully in the cspline and
periodic cspline interpolations.

** Removed potential cancellation error in calculation of uniform
histogram ranges.

** Improved numerical stability of integration for akima and cspline
interpolation.

** Differential equation solvers now handle error codes returned from
user-defined functions.

** Improved error estimates in ode-initval solvers, and provide exact
derivatives on output.  Added new semi-implicit ode-initval solver,
gsl_odeiv_step_rk2simp.

** Added missing function definition for gsl_sf_psi_1.

** Fixed the function gsl_sf_expint_Ei_scaled to call
gsl_sf_expint_Ei_scaled_e instead of gsl_sf_expint_Ei_e.

** Added cumulative distribution function for exponential power
distribution.

** The functions gsl_cdf_beta_P and gsl_cdf_beta_Q now return
consistent results of 0 or 1 for out of range values, x<0 and x>1,
rather than 0 for left and right tails simultaneously.

** The Jacobi eigensolvers gsl_eigen_jacobi and gsl_eigen_jacobi_invert 
have new implementations from Golub and Van Loan.

** The standard output and standard error streams are now flushed by
the default error handler before the program aborts, in order to
ensure that error messages are properly displayed on some platforms.

* What was new in gsl-1.5:

** Multifit routines now handle iterations where |f| is already
minimised to zero, without division by zero.

** Fixed the singular value tolerance test in the multifit covariance
calculation from < to <= to match the original MINPACK code.

** The macro HAVE_INLINE is now tested with #ifdef instead of #if as
in versions prior to 1.4, to match the documentation, and the macro
GSL_RANGE_CHECK_OFF now works correctly.  An alternative macro
GSL_RANGE_CHECK={0,1} can be used to control range-checking.

** Fixed a potential array overflow in gsl_ran_landau.

** Fixed a small discrepancy in the tolerance calculation of the
one-dimensional brent minimiser.

** Numerical derivatives should now be calculated using the
gsl_deriv_forward, gsl_deriv_central and gsl_deriv_backward functions,
which accept a step-size argument in addition to the position x.  The
original gsl_diff functions (without the step-size) are deprecated.

** Corrected documentation for gsl_ran_hypergeometric_pdf()

** The tridiagonal matrix solvers gsl_linalg_solve_symm_tridiag,
gsl_linalg_solve_tridiag, gsl_linalg_solve_symm_cyc_tridiag,
gsl_linalg_solve_cyc_tridiag now use the GSL_ERROR macro to report
errors, instead of simply returning an error code.  The arguments to
these functions must now use exact lengths with no additional
elements.  For cyclic systems all vectors must be of length N, for
tridiagonal systems the offdiagonal elements must be of length N-1.

** The singular value decomposition routines gsl_linalg_SV_decomp and
gsl_linalg_SV_decomp_mod now handle the SVD of a column vector (N=1,
arbitrary M), which can occur in linear fitting.

** Restored missing header files gsl_const_mks.h and gsl_const_cgs.h.
The incorrect values of the electrical units for gsl_const_cgs
(VACUUM_PERMEABILITY and VACUUM_PERMITTIVITY) have been removed.

** Fixed gsl_linalg_SV_decomp() to avoid an infinite loop when
computing the SVD of matrices containing Inf and Nan.

** Fixed gsl_linalg_balance_columns() to avoid an infinite loop when
rescaling matrices containing Inf and NaN.

** Fixed header file <gsl/gsl_sf_log.h> to include declarations for 
error codes in inline versions of gsl_sf_log functions

** Fixed header file <gsl/gsl_const.h> to include new MKSA and CGSM
header files.

** Added Stefan-Boltzmann constant and Thomson cross section to
physical constants

* What was new in gsl-1.4:

** Added cumulative distribution functions and their inverses for the
continuous random distributions including: gaussian, lognormal, gamma,
beta, cauchy, laplace, chisq, exponential, gumbel, weibull,
F-distribution, t-distribution, logistic, pareto and rayleigh.

** Added faster binomial random variates using the TPE rejection
algorithm, in the function gsl_randist_binomial_tpe.

** Added new functions gsl_rng_fwrite and gsl_rnd_fread for storing
the state of random number generators in a file.

** Added a new function gsl_combination_memcpy()

** Corrected values of electrical constants in CGS units.  To take
account of different electrical systems of units the values are now
prefixed by GSL_CONST_MKSA (for the SI Metre, Kilogram, Second, Ampere
system) or GSL_CONST_CGSM (for the Centimetre, Gram, Second, Magnetic
system with the Gauss as the fundamental unit of magnetic field
strength).  The previous GSL_CONST_MKS and GSL_CONST_CGS prefixes have
been removed, as have the permeability and permittivity constants in
the CGS system since this uses different defining equations.

** Fixed bugs in the random number generators gsl_rng_fishman18,
gsl_rng_fishman2x, and gsl_rng_knuthran2 which caused them to return
incorrect results.  Minor corrections were made to the parameters in
the other Knuth generators borosh13, coveyou, fishman20, lecuyer21,
and waterman14.

** Fixed a missing transpose bug in the gsl_linalg_QR_QRsolve
and gsl_linalg_QRPT_QRsolve routines which were computing the
solution to Q^T R x = b instead of Q R x = b.

** Fixed gsl_sf_gammainv to return zero instead of a domain
error for arguments corresponding to singularities in gamma.

** Fixed a bug in the simplex minimization algorithm which
caused it to fail to find the second highest point correctly
when searching the set of simplex points.

** Fixed a bug in the conjugate gradient minimizers conjugate_pr,
conjugate_fr and vector_bgfs which caused the search
directions to be updated incorrectly.

** Fixed a bug in gsl_sf_psi_1_int(1) which caused it to
return the incorrect sign for psi(1,1).

** Fixed the simulated annealing routine gsl_siman_solve to use the
parameter iters_fixed_T for the number of iterations at fixed
temperature instead of n_tries.

** Fixed a bug in gsl_combination_valid which caused it to return the
incorrect status.

** Fixed a bug in gsl_permutation_canonical_to_linear which caused the
output to always be zero, and the input permutation to be incorrectly
replaced by the output.

** Fixed a bug is gsl_ran_discrete which could cause uninitialised
data to be returned for some distributions.

** Fixed the dependencies for gsl_chebyshev.h to include gsl_math.h.

** Fixed a bug in gsl_complex_arccsc_real which caused it to return 
the incorrect sign for the imaginary part when -1<x<0.

** Fixed a bug in the QAWC Cauchy integration routine which could
allow the singularity to fall on an interval boundary, leading to
division by zero.

** Improved gsl_sf_gamma_inc_P(a,x) to avoid a domain error for x<<a
when a>10.

** Improved the accuracy of gsl_sf_coupling_3j for large arguments.

** Improved the performance of gsl_sf_choose(m,n) by separating the
calculations for small and large arguments.

** On platforms without IEEE comparisons gsl_{isnan,isinf,finite} will
fall back to the system versions of isnan, isinf and finite if
available.

** gsl_linalg_householder_hv now uses BLAS routines internally

** The script configure.in is now compatible with autoconf-2.50 and
later.

** Reduced the memory usage of the multifit algorithms from MxM to MxN
for large M by performing the QR decomposition of the Jacobian
in-place.

** IEEE modes now use the C99 fenv.h functions when platform spectific
functions are not available.

* What was new in gsl-1.3:

** Changed interface for gsl_sf_coupling_6j...(...). The old functions
actually calculated 6j for a permutation of the arguments (that
related to Racah W). This was incorrect and not consistent with
the documentation. The new versions calculate < {a,b,c}, {d,e,f} >,
as stated in the documentation. The old versions are still available
as gsl_sf_coupling_6j_INCORRECT...(...), though they are deprecated
and will be removed at some point in the future.

** Added new functions for computing Em(x)=exp(-x)*Ei(x), the modified
(scaled) form of the exponential integral, gsl_sf_expint_E1_scaled,
gsl_sf_expint_E2_scaled, gsl_sf_expint_Ei_scaled.
   
** Fixed compilation problems with gcc -ansi and other ANSI compilers.

** Fixed uninitialized memory access in the Niederreiter quasi-random
number generator.

** Fixed the eigenvalue routines to prevent an infinite loop for Inf
or NaN entries in matrix.

** Fixed a bug in the multifit and multiroots allocation routines
which cause them to fail to report some out of memory conditions.

** Fixed a bug in the seeding for the random number generator
gsl_rng_taus2 which affected a small number of seeds.

** Modified the complex householder transforms to avoid division by
zero, which could cause NaNs to be returned by the gsl_eigen_hermv
eigenvalue decomposition.

** The Nelder-Mead simplex algorithm for multidimensional 
minimisation has been added.

** The random number distributions now include the Dirichlet and
Multinomial distributions.

** Added a new function gsl_fcmp for approximate comparison of
floating point numbers using Knuth's algorithm.

** Added new functions gsl_ldexp and gsl_frexp as portable
alternatives to ldexp() and frexp().

** Fixed a bug in gsl_linalg_bidiag_unpack_B which was returning
incorrect results for the superdiagonal.

** Fixed a bug in the acceptance condition for simulated annealing

** Ordinary differential equations can now be solved using a different
absolute error for each component with gsl_odeiv_control_scaled_new().

** Upgraded to libtool-1.4.3

* What was new in gsl-1.2:

** Added new functions for combining permutations, converting between
cyclic and linear representations, and counting cycles and inversions.

** New multiroot functions now allow access to the current values of f
and dx.

** The default error handler now outputs a explanatory message before
aborting.

** Extended gsl_linalg_SV_decomp to handle exact zeroes in the
singular values, and added tests for 3x3 matrices.

** Fixed a bug in gsl_linalg_SV_decomp which caused singular values to
be sorted incorrectly.

** Fixed a bug in gsl_linalg_solv_symm_cyc_tridiag which caused it to
produce incorrect results.

** Added nonsymmetric tridiagonal solvers gsl_linalg_solve_tridiag and
gsl_linalg_solve_cyc_tridiag.

** The declarations used to export static objects can now be
controlled through a macro GSL_VAR and the header file
<gsl/gsl_types.h>.

** The simulated annealing routine gsl_siman_solve now keeps track of
the best solution so far.

** The values of the physical constants have been updated to the
CODATA 1998 recommendations.

** Added new physical constants, newton, dyne, joule, erg and 
power-of-ten prefixes, Mega, Giga, Tera, etc.

** The error estimate for the elliptic function gsl_sf_ellint_Kcomp_e
has been improved to take account of numerical cancellation for small
arguments.

** The domain of gsl_sf_psi_1piy has been extended to negative y.

** Fixed memory leak in the Chebyshev module.

** The seeding procedure of mt19937 has been updated to the latest
version from Makoto Matsumoto and Takuji Nishimura (Jan 2002). The
original seeding procedure is available through the generator
gsl_rng_mt19937_1999.

** A new random number generator gsl_rng_taus2 has been added to
correct flaws in the seeding procedure of gsl_rng_taus, as described
in an erratum to the original paper of P. L'Ecuyer.

** Added missing declaration for the generator gsl_rng_mt_19937_1998.

** Added missing quasi-random number generator function gsl_qrng_init.

** Removed unnecessary endpoint subtraction in chebyshev-based
QUADPACK routines to avoid possible loss of precision.

** Fixed bug in gsl_interp_cspline_periodic which caused a
discontinuity in the derivative near the boundary.

** The function gsl_min_fminimizer_minimum has been renamed to
gsl_min_fminimizer_x_minimum for consistency (the old function name is
still available but is deprecated).  Additional functions have been
added for accessing the function values at the minimum and endpoints
of the bounding interval.

** The KNOWN-PROBLEMS file of "make check" failures has been replaced
by a BUGS file, since we now require "make check" to work correctly
for stable releases.

* What was new in gsl-1.1.1:

** Fixes to histogram2d stat functions

** Added missing prototypes for complex LU determinant functions

** Improved error handling in multifit routines

** Added check to avoid division by zero for rank-deficient matrix in
multifit iteration

* What was new in gsl-1.1:

** The permutation module now includes a copy function
gsl_permutation_memcpy

** The implementation of gsl_sf_gamma_inc has been improved and now
avoids problems caused by internal singularities which occurred in the
series expansion for some combinations of parameters.

** IEEE comparisons of infinities and NaNs are tested during the
configure stage and the functions gsl_isnan, gsl_isinf and gsl_finite
are only compiled on platforms which support the necessary tests.

** The histogram routines now include a sum function,
gsl_histogram_sum for computing the total bin sum, and additional
statistics functions for 2d histograms.

** Internal error checking of user-defined functions has been improved
in the multiroots functions.

** Constants now include the Bohr Radius and Vacuum Permittivity.

** Range checking is now turned off when building the library, but is
still on by default when compiling user applications.

** A combinations directory has been added for generating combinations (n,k).

** The gamma function now returns exact values for integer arguments.

** Fixed bugs in gsl_sf_hyperg_1F1_int and gsl_sf_hyperg_1F1.

** Fixed internal error handling in gsl_sf_laguerre_n to allow
recovery from overflow.

** Several routines for handling divided difference polynomials have
been added to the poly/ directory.

** The interpolation routines now include polynomial interpolation,
based on divided-differences.

** Added new random number generators from Knuth's Seminumerical
Algorithms, 3rd Edition: borosh13, coveyou, fishman18, fishman20,
fishman2x, knuthran, knuthran2, lecuyer21, waterman14.

** Changed divisor in random number generator gfsr4 from 2^32-1 to
2^32 to prevent exact value of 1.0 from being returned, as specified
in the documentation.

* What was new in gsl-1.0:

** First general release.

** Increased the maximum number of iterations in gsl_poly_complex_solve()
from 30 to 60.

* What was new in gsl-0.9.4:

** Reorganized the multmin functions to use the same interface as the
other iterative solvers.

** Added histogram _alloc functions for consistency, in addition to the
existing _calloc functions.

** Renamed all the gsl_multimin functions to be consistent with the
rest of the library.  An underscore has been removed from _minimizer
in all the function names.

** Renamed the function gsl_sf_coulomb_CL_list to gsl_sf_coulomb_CL_array

** A bug in the multimin functions where the function parameters
(params) were omitted has been fixed.

** A bug in the nonlinear minimization routines has been fixed, which
could prevent the algorithms from converging.  Additional tests from
the NIST reference datasets have been added and these now agree with
MINPACK.

** All the physical constants and conversion factors are now defined as
real numbers to avoid potential problems with integer arithmetic.

** The ODE evolution routines now allow for negative step sizes, and
integrating backwards as well as forwards.

** The implicit Burlisch-Stoer ODE algorithm 'bsimp' now detects
singularities and forces a reduction in step size, preventing runaway
instabilities.

** Fixed a bug in the ODE evolution function gsl_odeiv_evolve_apply
which could cause an erroneous value to be returned if the step size
is reduced on the last step.

* What was new in gsl-0.9.3:

** Routines for complex LU decomposition are now available, allowing
the solution of systems of equations with complex coefficients.

** Matrix views of vectors now correctly require a unit stride for the
original vector.

** Permutations can now be applied to complex arrays and vectors.

** gsl_sf_pow_int now handles the case x = 0, n < 0

** The static versions of inline functions can now be hidden by
defining the preprocessor macro HIDE_INLINE_STATIC.  This is needed
for some compilers.

** The original seeding procedure of mt19937 is available through the
generator gsl_rng_mt19937_1998.  The seeding procedure was flawed, but
is available for compatibility.

** Added missing functions gsl_complex_div_real and
gsl_complex_div_imag.

** Missing functions for constant vector and matrix views have now been
added.

** Statistical calculations for histograms are now available, and the
gsl-histogram command also displays the histogram mean and standard
deviation.

** The behavior of GSL_IEEE_MODE for denormalized exceptions has been
fixed on Openbsd and Netbsd.

** A pkg-config file gsl.pc is included in the distribution

** The reference manual can now be printed in @smallbook format without
overflow.

* What was new in gsl-0.9.2:

** Vector and matrix views are now compliant with the ANSI standard.

** Added Lambert functions gsl_sf_lambert_W0, gsl_sf_lambert_Wm1.

** The reference manual now uses the GNU Free Documentation License.

** Fixed a couple of bugs in the SVD routines.

** Macros for Infinity and Nan now work correctly with Microsoft Visual
C++, and a bug in the config.h file for the finite() function has been
fixed.

** Redundant entries in the test suite for the complex math functions
have been removed, making the distribution size smaller.

** Installed programs gsl-randist and gsl-histogram now use shared
libraries.

* What was new in gsl-0.9.1:

** The single precision ffts now uses float throughout, rather than
mixing float and double.

** The random number distributions now include the Landau distribution.

** The fft function interface has been reorganized, with workspaces
separate from wavetables to eliminate unnecessary recomputation of
trigonometric factors.

** The gsl_interval type has been eliminated and replaced by two double
arguments for simplicity.

** The order of the arguments to the minimization routines is no more
logical, with function values assocatied with x-values.

** Modified initialization of vector and matrix views to work with the
SunPro compiler.

** Renamed gsl_Efunc_t to gsl_siman_Efunc_t, in accordance with
namespace conventions.

** Improved accuracy and fixed bugs in gsl_sf_hyperg_1F1,
gsl_sf_bessel_I0_scaled, gsl_sf_erfc, gsl_sf_log_erfc,
gsl_sf_legendre_Q0 and gsl_sf_legendre_Q1, and gsl_sf_zeta.

** Improved IEEE compliance of special functions, overflows now return
Inf and domain errors return NaN.

** Improved checking for underflows in special functions when using
extended precision registers

* What was new in gsl-0.9:

** There is a new system of vector and matrix views.  Any code using
vector and matrix views will need to be updated.  

** The order of arguments of the view functions involving strides have
been changed to be consistent with the rest of the library.

** The ode solvers have been reorganized.

** There are new eigensystem routines for real symmetric and complex
hermitian matrices.

** The linear algebra directory now includes functions for computing
symmetric tridiagonal decompositions and bidiagonal decompositions.

** The svd routines now include the Golub-Reinsch and Modified
Golub-Reinsch algorithms in addition to the Jacobi algorithm.

** The interpolation directory has been reorganized and a higher-level
"spline" interface has been added which simplifies the handling of
interpolation arguments.

** IEEE support is now available on OpenBSD.

* What was new in gsl-0.8:

** The build process now uses the latest libtool and automake.

** The library should now compile with Microsoft Visual C++.

** Portable versions of the isinf, isnan and finite functions are
available as gsl_isinf(x), gsl_isnan(x) and gsl_finite(x).

** The definitions of GSL_POSINF, GSL_NEGINF and GSL_NAN no longer
cause divisions by zero during compilation.

** The gsl_interp_obj has been renamed to gsl_interp.

** The poly_eval and pow_int functions have been moved from the
specfunc directory to the poly and sys directories.

** The Chebyshev functions are now available as an independent module
in their own directory.

** The error handling conventions have been unified across the
library.  This simplifies the use of the special functions.

** A full CBLAS implementation is now included for systems where ATLAS
has not been installed. The CBLAS library can also be used
independently of GSL.  The organisation of the BLAS directories has been
simplified.

** IEEE support for HPUX-11, NetBSD, Apple Darwin and OS/2 are now
included.

** The library now includes implementations of log1p, expm1, hypot,
acosh, asinh, atanh for platforms which do not provide them.

** The convention for alloc and set functions has changed so that they
are orthogonal. After allocating an object it is now necessary to
initialize it.

** There is a new module for estimating numerical derivatives of functions

** There is a new module for handling data with ntuples

** The histogram lookup functions are now optimized for the case of
uniform bins, and include an inline binary search for speed.

** The Chebyschev coefficients for the QAWO algorithm are now
precomputed in a table for efficiency, rather than being computed on
the fly.

** There are several new sorting functions for selecting the k-th
smallest or largest elements of a dataset.

** Iterator functions are now available for permutations,
gsl_permutation_next and gsl_permutation_prev.

** The function gsl_complex_xy has been renamed gsl_complex_rect

** The API for simulated annealing has been changed to support search
spaces in which the points cannot be represented as contiguous-memory
data structures.  gsl_siman_solve() now takes three extra arguments: a
copy constructor, a copy function and a destructor, allowing
gsl_siman_solve() to do its work with linked data structures.  If all
three of these function pointers are NULL, then the traditioanl
approach of using malloc(), memcpy(), and free() with the element size
is used.

* What was new in gsl-0.7:

** Linux/PowerPC should now be well supported.

** Header files for common physical constants have been added.

** Functions linear and nonlinear regression in one or more dimensions
are now available.

** Vector and matrix views now have access to the address of the
underlying block for compatibility with VSIPL (www.vsipl.org).

** There is a new library for generating low-discrepancy quasi-random
sequences.

** The seeding procedure of the default random number generator
MT19937 has been updated to match the 10/99 release of the original
code.  This fixes a weakness which occurred for seeds which were
powers of 2.

** The blas library libgslblasnative has been renamed libgslblas to avoid
confusion with system blas library

* What was new in gsl-0.6:

** The library is now installed as a single shared or static libgsl
file using libtool.

** The gsl-config script now works.  There is also a gsl.m4 file which
people can use in their configure scripts.

** All header files are now in installed as pkginclude headers in a
gsl/ subdirectory.

** The header files now use extern "C" to allow them to be included in
C++ programs

** For consistency the following functions have been renamed,

    gsl_vector_copy (dest, src) is now  gsl_vector_memcpy (dest, src)
    gsl_rng_cpy (dest, src)     is now  gsl_rng_memcpy (dest, src)
    gsl_matrix_copy_row (v,m,i) is now  gsl_matrix_get_row (v,m,i)
    gsl_matrix_copy_col (v,m,j) is now  gsl_matrix_get_col (v,m,j)
    gsl_vector_swap             is now  gsl_vector_swap_elements
    gsl_vector_swap_cols        is now  gsl_vector_swap_columns
    gsl_vector_swap_row_col     is now  gsl_vector_swap_row_column

and the vector/matrix view allocation functions have been simplified.

** A new sort directory has been added for sorting objects and vectors.

** A permutation directory has been added for manipulating permutations

** Statistics functions now support a stride argument for generality, and
also support weighted samples and a covariance function.

** The names of the statistics functions have been reorganized for
improved clarity. Consult manual for details.

** The environment variable GSL_IEEE_MODE now uses "," as a separator
instead of ";"

** The autogen.sh script, mostly for use by developers who use the CVS
repository, now does not run configure.

** The histogram directory now has additional functions for copying
and comparing histograms, performing arithmetic on histograms and
finding maximum and minimum values. Corresponding functions have been
added for vectors and matrices.

** The linear algebra directory supports additional methods, including
rectangular QR, rectangular QRPT and Cholesky decomposition.

** Complex arithmetic (+,-,*,/) and complex elementary functions
(sqrt, log, exp, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh,
tanh, arcsinh, arccosh, arctanh) are now supported.

** Multidimensional minimization methods are now available.

** The special functions directory now includes a routine for
computing the value of the incomplete beta function.

* Was new in gsl-0.5:

** There is now a KNOWN-PROBLEMS file which lists compilation problems
and test failures which are known to the developers.

** Many improvements have been made to the special functions directory.

** The extrapolations from the Levin u-transform are now more reliable.

** Linear algebra and Eigensystem routines are now available.

** ODE solvers are now available.

** Multidimensional root finding algorithms are available.

** Minimization now keeps track of function values.

** Matrices and vectors now use a BLAS compatible format, and have a
separate memory handling layer (gsl_block).

** Roots of general polynomials can now be found using gsl_poly_complex_solve

** IEEE modes support on Sparclinux, Tru64, AIX and IRIX

** We have added the second generation RANLUX generators RANLXS and RANLXD

** Minimization algorithms are available (one-dimensional)

** Documentation now works out of the box with the standard Texinfo.

** Full reimplementation of the QUADPACK integration library

** Introduced THANKS file.
We appreciate all patches from people on the net, even those which are
too small to warrant adding the author to the AUTHORS file.  The
THANKS file should include everyone who sent in patches.  They should
also be mentioned in the ChangeLog entry.

* What was new in gsl-0.4.1:

** Two changes not making their way into the documentation
A couple of things are not getting into the docs, so here are the
errata:
*** The FFT routines now take a stride parameter.  Passing 1 for the
stride will make them behave as documented.
*** The complex numbers are now an opaque type, and no assumptions can
be made about the format in which they are stored (they are not stored
as a simple structure anymore, since that is not portable).  The type
is now gsl_complex (or gsl_complex_long_double or gsl_complex_float),
and the macros to access them are
    GSL_REAL(z)
    GSL_IMAG(z)
    GSL_COMPLEX_P_REAL(zp)
    GSL_COMPLEX_P_IMAG(zp)
    GSL_COMPLEX_EQ(z1,z2)
    GSL_SET_COMPLEX(zp,x,y)
    GSL_SET_REAL(zp,x)
    GSL_SET_IMAG(zp,y)

This change in the complex number API makes it important that you
start working with 0.4.1 or later.

** 0.4.1 is being released in occasion of the Red Hat 6.0 release.
The specfunc module is still in an alpha state; if you run "make
check" in the specfunc directory you will see that some tests still
fail.

** Most Alpha specific problems have been fixed. In particular the
random number generators rand48 and ranf now work on the Alpha

** Additional random number distributions: 
   Rayleigh distribution
   n-dimensional spherical distribution 
     (ie, points at random on an n-dimensional sphere)
   Gaussian tail distribution 
     (ie, choosing values from a gaussian distribution subject to a 
      constraint that they be larger than some fixed value, eg 5 sigmas)
   Walker's algorithm for arbitrary discrete distributions

* What was new in gsl-0.4:

** A single libgsl.a file is built in the top level directory and
installed, instead of separate .a files for each subdirectory.

** The parts of the complex struct gsl_complex, .real and .imag, are
not supported anymore. The macros GSL_REAL(z) and GSL_IMAG(z) do the
same job. All complex numbers are considered as packed arrays of
floating point numbers, for portability since the layout of structs or
arrays of structs is not guaranteed.

** The interface for matrices and vectors has changed. Vectors now
support strides, and can be used to access rows and columns of a
matrix. Many more types are available (float, double, long double,
int, long, short, char, signed and unsigned, plus complex floats,
doubles and long doubles) due to improvements in our preprocessor
template system.

** The random number generators have a completely new thread-safe
interface and have moved from the random directory to the rng
directory. Any program using random numbers will have to be
updated. You can also choose generators and seeds using the
environment variables GSL_RNG_TYPE and GSL_RNG_SEED.

** Some additional random number distributions have been added in the
randist directory. The available distributiosn are: bernoulli, beta,
binomial, cauchy, chisq, erlang, exponential, fdist, flat, gamma,
gauss, geometric, levy, logistic, lognormal, nbinomial, pareto,
poisson, sphere, tdist, twosidedexp, weibull.

** The FFT interface has be extended to support strides, but the
implementation hasn't been finished for all the cases yet, The FFT
allocation functions now return a pointer to a newly allocated
wavetable struct, instead of taking the pointer to an existing struct
as an argument.

   e.g. status = gsl_fft_wavetable_alloc(n, w)
   is now    w = gsl_fft_wavetable_alloc(n) in accordance with usual practice

** The statistics directory now works with all the builtin
types. It has a new function for computing the lag1-autocorrelation and
an extra set of numerical accuracy tests from NIST as part of 'make
check'.

** The simulated annealing routines no longer set the random number
seed with the time of day.  You'll need to reseed the generator
yourself if you want subsequent runs to use different random numbers.

** Work is in progress on a reimplementation of QUADPACK in the
`integration' subdirectory, but it is not finished yet.

** Work is in progress on reimplementations of the VEGAS and
MISER Monte Carlo algorithms in the monte' subdirectory.  They work
just fine, but the code is still evolving.

** Work has started on a portable blas system in the `blas'
subdirectory.

** You can now set the IEEE arithmetic mode for your programs from the
environment variable GSL_IEEE_MODE by calling the function
gsl_ieee_env_setup(). Currently this only works with the Linux kernel,
HP-UX, SunOS4 and Solaris.

** There are some simple spline interpolation functions in the `interp'
subdir.

** The NEWS file now uses outline mode, like the Emacs NEWS file


* This covers changes made *after* the gsl-0.2 snapshot

** Added several new modules: histogram, integration, matrix, specfunc
and vectors.

** Changed libgsl_statisctics.a to libgslstatistics.a and
libgsl_siman.a to libgslsiman.a, since most of the packages don't have
the underscore.  Users will have to remove the old files, unless they
do a "make uninstall" on the previous release before they install this
new one.

** Changes to the random number suite
Incorporated the gauss, poisson and exponential distributions in
the standard libgslrandom.a


Local variables:
mode: outline
paragraph-separate: "[ 	]*$"
end:
