行列の固有値を計算するプログラムをVC++2005とgcc4.4.1でコンパイル実行
すると、全く同じプログラムなのに結果が違う。ちなみにMATLABの結果は
VC++の結果と一致している。

2日ほど悩んでいたが...

原因は、何と自作のライブラリファイルで使っていたabs関数に「std::」をつけて
いないことだったorz。

xをdouble型の変数としてabs(x)を呼べば関数のオーバーロードによって
double abs(double x) が呼び出されると思っていたのにgccではint abs(int i)
が呼び出されていて結果が違っていた。xがdoubleであってもintに型キャスト
されるため整数部(の絶対値)のみが返ってきていた。

これはC++の数学関数が標準名前空間std内にあることによるのだろうが
(ちなみに #include <cmath>としている)、VC++では「std::」をつけなく
ても問題なく、double abs(double x) が呼ばれている。

C++の仕様としては、gccとVC++どちらが正しいでしょうか?

「std::」をつけなくてもコンパイルエラーや警告がでず、意図しない
別のabsが呼ばれるgccの方が怖いですけど。