2013-05-24 3 views
1

Вопрос довольно простой, но я немного потерялся здесь. Я работаю над библиотекой, которая работает со сложными числами. До сих пор я использовал свою реализацию в 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.

+2

Они оба правильные. Квадратный корень любого числа имеет два решения, положительные и отрицательные. –

+0

Я не уверен, что «или» обязательно более прав, чем другой, но как насчет использования 'abs' для фиксации знака? –

ответ

1

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

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

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

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

+0

Да, но у меня есть квадрат сложного числа (тем не менее мнимая часть равна 0) и не должна меняться знак мнимой части (вторая строка)? – Stoiker

+0

@ Стойкер Комплексное число с нулевой мнимой частью * является * действительным числом. И '-0' из gcc выглядит очень странно для меня. – molbdnilo

Смежные вопросы