Вопрос довольно простой, но я немного потерялся здесь. Я работаю над библиотекой, которая работает со сложными числами. До сих пор я использовал свою реализацию в Mac OS 10.8 и Ubuntu 10.04 (используя llvm-gcc для Man и gcc под Ubuntu). Вчера я попробовал это на другой машине с icpc (icc/2013.3), и сложная часть хруста с номером не удалась.Квадратный корень комплексных чисел - g ++ vs icpc
Я прибил проблему вниз, используя этот простой пример:
#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 «неправильная» или есть флаг для этой конкретной проблемы?
обновление Я знаю, что оба результата действительны с математической точки зрения, однако мне нужно ССАГПЗ результат также при использовании ICPC.
Они оба правильные. Квадратный корень любого числа имеет два решения, положительные и отрицательные. –
Я не уверен, что «или» обязательно более прав, чем другой, но как насчет использования 'abs' для фиксации знака? –