复数的平方根 - g ++ vs icpc

时间:2013-05-24 08:31:37

标签: c++ standards complex-numbers icc

一个相当基本的问题,但我在这里有点迷失。我正在开发一个使用复数的库。到目前为止,我在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结果。

1 个答案:

答案 0 :(得分:1)

sqrt通常是非负平方根,这是数学中“平方根”符号所表示的那个。

根据(草案)标准(26.4.8,复杂的超验),

  

如果参数是负实数,则返回的值为on   正虚轴。

所以看起来gcc在这里有问题。