Довольно простой вопрос, но я немного потерян здесь. Я работаю над библиотекой, которая работает с комплексными числами. До сих пор я использовал свою реализацию под 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.
sqrt
обычно это неотрицательный квадратный корень, обозначаемый знаком «квадратный корень» в математике.
Согласно (проекту) стандарта (26.4.8, сложные трансцендентные),
Если аргумент является отрицательным действительным числом, возвращаемое значение лежит на
положительная мнимая ось.
так что похоже, что здесь виноват gcc.
Других решений пока нет …