Jak mogę pracować z liczbami zespolonymi w C? Widzę, że istnieje complex.h
plik nagłówkowy, ale nie zawiera on zbyt wielu informacji o tym, jak go używać. Jak efektywnie uzyskać dostęp do rzeczywistych i wyimaginowanych części? Czy istnieją natywne funkcje do pobrania modułu i fazy?
c
complex-numbers
Charles Brunet
źródło
źródło
Odpowiedzi:
Ten kod ci pomoże i jest dość zrozumiały:
z:
creal(z1)
: zdobądź prawdziwą część (dla floatcrealf(z1)
, dla długiego doublecreall(z1)
)cimag(z1)
: pobierz część urojoną (dla floatcimagf(z1)
, dla długiego doublecimagl(z1)
)Innym ważnym punktem pamiętać podczas pracy z liczb zespolonych jest to, że funkcje takie jak
cos()
,exp()
isqrt()
muszą być zastępowane ich złożonych form, na przykładccos()
,cexp()
,csqrt()
.źródło
double complex
? Czy to rozszerzenie języka, czy jakaś magia makr?complex
to standardowy typ c99 (pod maską w GCC jest to właściwie alias do typu _Complex).complex
nie jest typem. Jest to makro, które rozwija się do_Complex
, które jest specyfikatorem typu , ale nie jest typem samym w sobie. Złożone typyfloat _Complex
,double _Complex
ilong double _Complex
.Typy złożone są w języku C od standardu C99 (
-std=c99
opcja GCC). Niektóre kompilatory mogą implementować złożone typy nawet we wcześniejszych trybach, ale jest to niestandardowe i nieprzenośne rozszerzenie (np. IBM XL, GCC, może być intel, ...).Możesz zacząć od http://en.wikipedia.org/wiki/Complex.h - zawiera opis funkcji z complex.h
Ten podręcznik http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html również zawiera informacje o makrach.
Aby zadeklarować zmienną złożoną, użyj
lub
Aby nadać wartość złożonemu, użyj
_Complex_I
makra zcomplex.h
:(właściwie mogą tu występować problemy z
(0,-0i)
liczbami i NaN w jednej połowie złożonej)Moduł to
cabs(a)
/cabsl(c)
/cabsf(b)
; Prawdziwą częścią jestcreal(a)
wyobrażeniecimag(a)
.carg(a)
służy do złożonych argumentów.Aby uzyskać bezpośredni dostęp (odczyt / zapis) do rzeczywistej części obrazu , możesz użyć tego nieporęcznego rozszerzenia GCC :
źródło
(complex float) { r, i }
można również użyć do ustawienia oddzielnych części liczby i niezależnie (na przykład część rzeczywista to INF, podczas gdy część urojoną to NAN). Pozwala to uniknąć słowa kluczowego specyficznego dla GCC, chociaż nie jestem pewien, czy rzeczywiście jest przenośny.__STDC_NO_COMPLEX__
. W praktyce jest jednak zaimplementowany na głównych kompilatorach.complex
zostanie zdefiniowany jako makro, rozszerzony do_Complex
. Możesz być także zainteresowany "The New C Standard: An Economic and Cultural Commentary" (2008) strona 500 "złożone typy" people.ece.cornell.edu/land/courses/ece4760/…Complex.h
źródło
Dla wygody można dołączyć
tgmath.h
bibliotekę dla typu generującego makra. Tworzy tę samą nazwę funkcji co podwójna wersja dla wszystkich typów zmiennych. Na przykład, na przykład, definiujesqrt()
makro, która rozciąga się nasqrtf()
,sqrt()
lubsqrtl()
funkcji, w zależności od rodzaju argumentu usług.Nie trzeba więc pamiętać odpowiedniej nazwy funkcji dla różnych typów zmiennych!
źródło
Pojęcie liczb zespolonych zostało wprowadzone do matematyki z potrzeby obliczania ujemnych pierwiastków kwadratowych. Złożona koncepcja liczbowa została podjęta w różnych dziedzinach inżynierii.
Dziś te liczby zespolone są szeroko stosowane w zaawansowanych dziedzinach inżynierii, takich jak fizyka, elektronika, mechanika, astronomia itp.
Część rzeczywista i urojona ujemnego pierwiastka kwadratowego:
źródło
Aby wyodrębnić część rzeczywistą wyrażenia o wartościach zespolonych
z
, użyj notacji as__real__ z
. Podobnie użyj__imag__
atrybutu w,z
aby wyodrębnić część urojoną.Na przykład;
r jest częścią rzeczywistą liczby zespolonej „z” i jest częścią urojoną liczby zespolonej „z”
źródło