Bagaimana saya bisa bekerja dengan bilangan kompleks di C? Saya melihat ada complex.h
file header, tetapi tidak memberi saya banyak informasi tentang cara menggunakannya. Bagaimana cara mengakses bagian nyata dan imajiner dengan cara yang efisien? Apakah ada fungsi asli untuk mendapatkan modul dan fase?
c
complex-numbers
Charles Brunet
sumber
sumber
Jawaban:
Kode ini akan membantu Anda, dan cukup jelas:
dengan:
creal(z1)
: dapatkan bagian nyata (untuk floatcrealf(z1)
, untuk double panjangcreall(z1)
)cimag(z1)
: dapatkan bagian imajiner (untuk floatcimagf(z1)
, untuk double panjangcimagl(z1)
)Hal lain yang penting untuk diingat ketika bekerja dengan bilangan kompleks adalah bahwa fungsi seperti
cos()
,exp()
dansqrt()
harus diganti dengan bentuk kompleks mereka, misalnyaccos()
,cexp()
,csqrt()
.sumber
double complex
? Apakah ini ekstensi bahasa atau sihir makro?complex
adalah tipe c99 standar (di bawah kap pada GCC, ini sebenarnya adalah alias untuk tipe _Complex).complex
bukan tipe. Ini adalah makro yang diperluas ke_Complex
, yang merupakan penentu tipe , tetapi bukan tipe itu sendiri. Jenis kompleksfloat _Complex
,double _Complex
danlong double _Complex
.Tipe kompleks ada dalam bahasa C sejak standar C99 (
-std=c99
opsi GCC). Beberapa kompiler mungkin mengimplementasikan tipe kompleks bahkan dalam mode yang lebih awal, tetapi ini adalah ekstensi non-standar dan non-portabel (misalnya IBM XL, GCC, mungkin intel, ...).Anda dapat mulai dari http://en.wikipedia.org/wiki/Complex.h - ini memberikan deskripsi fungsi dari complex.h
Panduan ini http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html juga memberikan beberapa info tentang makro.
Untuk mendeklarasikan variabel kompleks, gunakan
atau
Untuk memberi nilai menjadi kompleks, gunakan
_Complex_I
makro daricomplex.h
:(sebenarnya mungkin ada beberapa masalah di sini dengan
(0,-0i)
angka dan NaN di setengah kompleks tunggal)Modul adalah
cabs(a)
/cabsl(c)
/cabsf(b)
; Bagian sebenarnya adalahcreal(a)
, Imajinercimag(a)
.carg(a)
adalah untuk argumen yang kompleks.Untuk langsung mengakses (membaca / menulis) bagian gambar nyata, Anda dapat menggunakan ekstensi GCC yang tidak dapat dibawa ini :
sumber
(complex float) { r, i }
juga dapat digunakan untuk mengatur bagian-bagian terpisah dari bilangan dan secara independen (memungkinkan bagian nyata menjadi INF sedangkan bagian imajiner adalah NAN, misalnya). Itu menghindari kata kunci khusus GCC, meskipun saya tidak yakin apakah itu benar-benar portabel.__STDC_NO_COMPLEX__
. Namun dalam praktiknya, ini diterapkan pada kompiler utama.complex
akan ditentukan sebagai makro, diperluas menjadi_Complex
. Anda mungkin juga tertarik di Derek M. Jones "The New C Standard: Sebuah Ekonomi dan Budaya Commentary" (2008) halaman 500 "jenis kompleks" people.ece.cornell.edu/land/courses/ece4760/...Complex.h
sumber
Untuk kenyamanan, seseorang mungkin menyertakan
tgmath.h
pustaka untuk tipe menghasilkan makro. Ini menciptakan nama fungsi yang sama dengan versi ganda untuk semua jenis variabel. Sebagai contoh, misalnya, mendefinisikansqrt()
makro yang memperluas kesqrtf()
,sqrt()
atausqrtl()
fungsi, tergantung pada jenis argumen yang disediakan.Jadi orang tidak perlu mengingat nama fungsi yang sesuai untuk tipe variabel yang berbeda!
sumber
Gagasan tentang bilangan kompleks diperkenalkan dalam matematika, dari kebutuhan menghitung akar kuadrat negatif. Konsep bilangan kompleks diambil oleh berbagai bidang teknik.
Saat ini, bilangan kompleks banyak digunakan dalam domain teknik lanjutan seperti fisika, elektronik, mekanik, astronomi, dll.
Bagian nyata dan imajiner, dari contoh akar kuadrat negatif:
sumber
Untuk mengekstrak bagian nyata dari ekspresi bernilai kompleks
z
, gunakan notasi sebagai__real__ z
. Demikian pula, gunakan__imag__
atribut padaz
untuk mengekstrak bagian imajiner.Sebagai contoh;
r adalah bagian nyata dari bilangan kompleks "z" i adalah bagian imajiner dari bilangan kompleks "z"
sumber