Квадратный корень комплексных чисел — g ++ против icpc

Довольно простой вопрос, но я немного потерян здесь. Я работаю над библиотекой, которая работает с комплексными числами. До сих пор я использовал свою реализацию под Mac OS 10.8 и Ubuntu 10.04 (используя llvm-gcc на Man и gcc под Ubuntu).
Вчера я попробовал это на другой машине с 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, поэтому результат должен быть правильным (со всеми вещами со знаком ноль … и т. Д.). Так что реализация icpc «неправильная» или есть флаг для этой конкретной проблемы?

Обновить
Я знаю, что оба результата верны с математической точки зрения, однако мне нужен результат gcc также при использовании icpc.

1

Решение

sqrt обычно это неотрицательный квадратный корень, обозначаемый знаком «квадратный корень» в математике.

Согласно (проекту) стандарта (26.4.8, сложные трансцендентные),

Если аргумент является отрицательным действительным числом, возвращаемое значение лежит на
положительная мнимая ось.

так что похоже, что здесь виноват gcc.

1

Другие решения

Других решений пока нет …