Типирование std :: complex & lt; double & gt; __complex128

Я пытаюсь использовать библиотеку quadmath в GCC. У меня есть сложное двойное значение, которое я хотел бы ввести в соответствующее комплексное число с четверной точностью, __complex128, Ниже приведен минимальный (не) работающий пример:

#include <quadmath.h>
#include <complex>
#include <stdio.h>
using namespace std::complex_literals;

int main(){
std::complex<double> x = 1 + 2i;
std::printf("x = %5.5g + %5.5g\n", x.real(), x.imag());
__complex128 y = 2+2i;
y = x;
return 0;
}

Когда я пытаюсь скомпилировать этот код с

 g++ test.cpp -lquadmath -o test

Я получаю следующую ошибку:

test.cpp:10:6: error: cannot convert 'std::complex<double>' to '__complex128 {aka __complex__ __float128}' in assignment
y = x;

Если я попытаюсь заменить строку назначения явным приведением типа,

y = (__complex128) x;

Я получаю похожую ошибку

test.cpp:10:21: error: invalid cast from type 'std::complex<double>' to type '__complex128 {aka __complex__ __float128}'
y = (__complex128) x;

Как можно конвертировать между этими двумя типами?

6

Решение

Я думаю, что вы используете GCC, в этом случае вы можете использовать __real__ а также __imag__ расширения для установки отдельных компонентов вашего __complex128:

__complex128 y;
__real__ y = x.real();
__imag__ y = x.imag();

Это также работает в Clang для __complex64 (Clang еще не поддерживает __complex128).

2

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

Я должен предположить, что здесь есть какая-то проблема совместимости типов, поскольку, насколько я могу судить, __complex__ довольно древний (см. https://gcc.gnu.org/onlinedocs/gcc/Complex.html). Чтобы обойти эту проблему, вы можете попробовать:

y = 1.0i;
y *= x.imag();
y += x.real();
0

По вопросам рекламы [email protected]