2017-01-21 14 views
5

Я пытаюсь использовать библиотеку quadmath в GCC. У меня есть сложное двойное значение, которое я хотел бы привести к соответствующему квадратичному комплексному числу, __complex128. Ниже приводится минимальный (не) -рабочая пример:Typecasting std :: complex <double> to __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; 

Как один новообращенный между этими двумя типами?

ответ

2

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

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

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

+0

Спасибо! Это сделал трюк. Я не знал о расширениях __real__ и __imag__. Острота. – Jeff

0

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

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

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

  • Нет связанных вопросов^_^