一个相当基本的问题,但我在这里有点迷失。我正在开发一个使用复数的库。到目前为止,我在Mac OS 10.8和Ubuntu 10.04下使用了我的实现(在Man上使用llvm-gcc,在Ubuntu下使用gcc)。 昨天我在另一台机器上用icpc(icc / 2013.3)尝试了它,复杂的数字处理部分失败了。
我使用这个简单的例子来解决问题:
#include <iostream>
#include <complex>
using namespace std;
int main(int argc, char* argv[])
{
std::complex<double> tmpcmplxnumber(26.0,0.0);
cout << "Number: " << tmpcmplxnumber << endl;
std::complex<double> newcmplxnumber = 1.0 - tmpcmplxnumber;
cout << "New Number: " << newcmplxnumber << endl;
cout << "Sqrt of New Number: " << sqrt(newcmplxnumber) << endl;
return 0;
}
gcc输出(两台机器):
Number: (26,0)
New Number: (-25,-0)
Sqrt of New Number: (0,-5)
icpc输出:
Number: (26,0)
New Number: (-25,0)
Sqrt of New Number: (0,5)
如果我被正确通知gcc实现了ISO标准,那么结果应该是正确的(带有所有signed-zero东西等等)所以icpc实现是“错误的”或者是否有针对该特定问题的标志?
更新 我知道从数学的角度来看这两个结果都是有效的,但是在使用icpc时我也需要gcc结果。
答案 0 :(得分:1)
sqrt
通常是非负平方根,这是数学中“平方根”符号所表示的那个。
根据(草案)标准(26.4.8,复杂的超验),
如果参数是负实数,则返回的值为on 正虚轴。
所以看起来gcc在这里有问题。