2017-01-21 18 views
5

Tôi đang cố gắng sử dụng thư viện quadmath trong GCC. Tôi có một giá trị gấp đôi phức tạp mà tôi muốn được nhập vào số phức phức hợp chính xác bốn, __complex128. Sau đây là một tối thiểu (không) -working dụ:Tạo kiểu chữ 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; 
} 

Khi tôi cố gắng biên soạn mã này với

g++ test.cpp -lquadmath -o test 

tôi nhận được lỗi sau:

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

Nếu tôi cố gắng thay thế đường phân công có loại dàn diễn viên rõ ràng,

y = (__complex128) x; 

Tôi gặp lỗi tương tự

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

Làm cách nào để chuyển đổi giữa hai loại này?

Trả lời

2

Tôi đoán bạn đang sử dụng GCC, trong trường hợp này bạn có thể sử dụng __real____imag__ phần mở rộng để thiết lập các thành phần riêng lẻ của bạn __complex128:

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

này hoạt động trong Clang cho __complex64, quá (Clang doesn chưa hỗ trợ __complex128).

+0

Cảm ơn! Điều đó đã làm các trick. Tôi không biết về các tiện ích mở rộng __real__ và __imag__. Tiện lợi. – Jeff

0

Tôi phải giả định rằng có một số loại vấn đề tương thích về loại ở đây, vì theo như tôi có thể nói __complex__ là khá cổ đại (xem https://gcc.gnu.org/onlinedocs/gcc/Complex.html). Để giải quyết vấn đề này, bạn có thể thử:

y = 1.0i; 
y *= x.imag(); 
y += x.real(); 
Các vấn đề liên quan