2010-11-04 40 views
37

Làm thế nào để in (với printf) số phức? Ví dụ: nếu tôi có mã này:Số phức và printf

#include <stdio.h> 
#include <complex.h> 
int main(void) 
{ 
    double complex dc1 = 3 + 2*I; 
    double complex dc2 = 4 + 5*I; 
    double complex result; 

    result = dc1 + dc2; 
    printf(" ??? \n", result); 

    return 0; 
} 

..những gì tôi nên sử dụng để thay thế thông số chuyển đổi (hoặc cái gì khác) "???"

Trả lời

43
printf("%f + i%f\n", creal(result), cimag(result)); 

Tôi không tin rằng có một trình định dạng định dạng cụ thể cho loại phức tạp C99.

+0

Tôi thấy, cảm ơn vì sự giúp đỡ – gameboy

+0

Tôi có thể sai ở đây, nhưng vì creal() và cimag() đều trả về gấp đôi, nên định dạng không phải là '% lf' thay vì đơn giản '% f'? –

+2

Cải tiến bổ sung - macro phản ứng với dấu hiệu của phần ảo: '#define printfc (c) printf ("% f% c% fi ", creal (c), (cimag (c)> = 0.0f)? '+ ':' \ 0 ', cimag (c)) ' –

-1

Vì số phức tạp được lưu giữ như hai số thực back-to-back trong bộ nhớ, làm

printf("%g + i%g\n", result); 

sẽ làm việc tốt, nhưng tạo ra cảnh báo trình biên dịch với gcc vì loại và số lượng các thông số doesn' t khớp với định dạng. Tôi làm điều này trong một nhúm khi gỡ lỗi nhưng không làm điều đó trong mã sản xuất.

+1

Tôi cho rằng dựa vào hành vi không xác định khi gỡ lỗi là một ý tưởng tồi. Hành vi không xác định thường có thể gây ra các lỗi tinh vi khác, làm trầm trọng thêm vấn đề. Cộng với nó là tất cả quá phổ biến cho mã gỡ rối throwaway để kết thúc trong sản xuất. –

+2

Điều này sẽ chỉ hoạt động nếu các quy ước gọi điện của nền tảng chỉ định rằng các số phức được chuyển theo cùng một cách với hai số thực, không được đảm bảo. –

+2

Đó là, tuy nhiên, để gỡ lỗi chỉ, khá một hack tốt đẹp. Cảm ơn bạn cho ý tưởng. –

3

Hãy %+f chọn dấu hiệu chính xác cho bạn cho phần ảo:

printf("%f%+fi\n", crealf(I), cimagf(I)); 

Output:

0.000000+1.000000i 

Lưu ý rằng i là lúc kết thúc.

Các vấn đề liên quan