GNU Scientific Library

GNU Scientific Library (GSL) は、C言語で記述された科学技術計算関数のライブラリである。オープンソースであり、GNU General Public Licenseのもとで配布されている。
このプロジェクトは1996年にロスアラモス国立研究所のDr. M. GalassiとDr. J. Theilerの着想に始まり、計算物理の専門家集団（Dr G. Jungman、Dr B. Gough、Dr J. Davies、R. Priedhorsky、Dr M. Booth、Dr F. Rossi、Dr D. Eddelbuettelら）を中心に作成された。
線形計算についてはBLASをサポートしており、CBLAS インターフェイスを実装している。
Linuxをはじめ、Unix系OSを中心にサポートしている。Microsoft Visual Studio用のバイナリもある。
参考論文のレファレンス、文献等も充実している (リファレンス・マニュアルには日本語訳がある)。リファレンス・マニュアルにはサンプル・コードも多数収録されている。PSPP、Perl Data Language ()、O2sclなどのフリーウェア・プロジェクトでも利用されている。
複素数型やベクトル／行列型などは ANSI C で規定されている構造体で実装されており、C++ のクラスではない。そのためたとえば、複素数オブジェクト同士の加算が + 演算子で行えるようになっている訳ではなく、加算のための関数 (この場合 gsl_complex_add) を、二つの複素数オブジェクトを引数として呼ばねばならない。なお複素数型について、gsl-2.7 以降で C11に対応するCコンパイラを用い、 ヘッダファイルを適切にインクルードすれば、gsl_complex 型を C11標準の複素数型と同様に扱えるようになった。
拡張倍精度以上の精度における計算は、変数の内部表現が言語仕様で標準化されておらず、さらに環境に依存して精度が大きく変化するために対応していない。
開発.
GSL の開発チームは、GSL が GNUプロジェクトのパッケージであることを明示しており、GSL のコードはすべて誰もが自由に、どんな用途にでも使えることを保証している。そのために、プロプライエタリなコードや (たとえば 書籍 Numerical Recipes ISBN 4874085601 などの) GNU の定義するフリーソフトウェアに該当しないコードとは対立した開発姿勢をとっている。
2011年現在、年に1〜2回のメンテナンスリリースによるバグ修正対応が基本になっている。一方でブロックやスライスといったデータ構造の有用性や C++ 対応の是非についての議論も ML 上で行われており、もし議論が収束して開発陣での合意が形成されれば将来のバージョンで反映される可能性があるが、具体的なスケジュールを考慮するような段階ではない。
C++ サポート.
GSL は C 言語ライブラリであるため、C++のクラスから利用できる。しかしメンバー関数へのポインタは、その型が関数へのポインタとは異なるため、利用できない。関数へのポインタは、静的に定義された関数 (C言語における一般的な関数定義によるもの) に対して利用する必要がある。
C++から GSL を利用するためのラッパーも複数あるが、いずれも不完全であり、どの開発もあまり活発ではないか、停止している。GSL のヘルプ・メイリング・リストの議論では、ラッパーを使わなくても普通に関数を呼ぶのに支障はない、ベクトル用にラッパーを作って使っている、線形代数が目的ならEigenがある、などの情報が寄せられている。
なお、Microsoft Visual Studio 2008用にまとめられたパッケージが公開されている。
他の言語とのバインディング.
FORTRAN から GSL の各関数を利用するためのインターフェイスが開発中であり、β版がリリースされている。またラッパーを自作したい場合の情報も公開されている。
GNU Octave から GSL の特殊関数を利用できるパッケージがリリースされている。
GSL のホームページ に紹介されているもののうち、現在も開発が続いている主な言語バインディングを以下に挙げる。
プログラム例.
ベッセル関数の値を計算する C プログラムの例を以下に示す。
int main(void)
 double x = 5.0;
 double y = gsl_sf_bessel_J0(x);
 printf("J0(%g) = %.18e\n", x, y);
 return 0;
GNU Make を使って上のプログラムをコンパイルし、GSL とリンクしようとする場合、そのコマンドは Makefile ファイル中では以下のようになる。
上のコマンドで生成された実行ファイルを実行すると、以下のように出力する。計算値の精度は倍精度実数である。