Kiểu dữ liệu phức

Một số ngôn ngữ lập trình cung cấp **kiểu dữ liệu phức** để lưu và thực hiện các phép toán số học số phức dưới dạng một kiểu dữ liệu có sẵn (cơ bản).

Trong một số môi trường lập trình, thuật ngữ *kiểu dữ liệu phức* có thể được dùng đồng nghĩa với kiểu dữ liệu phức hợp (trái với kiểu dữ liệu cơ bản).

## Số học số phức
Một biến hoặc giá trị phức thường được biểu diễn dưới dạng một cặp số thực dấu phẩy động. Các ngôn ngữ hỗ trợ kiểu dữ liệu phức thường cung cấp các cú pháp đặc biệt để xây dựng các giá trị này, đồng thời mở rộng các phép toán số học cơ bản ('+', '&minus;', '×', '÷') để áp dụng với số phức. Các phép toán này thường được biên dịch thành một chuỗi mã lệnh dấu phẩy động hoặc thành các lệnh gọi thư viện. Những ngôn ngữ này cũng có thể hỗ trợ các thao tác khác như định dạng, kiểm tra bằng nhau, v.v.  Giống như trong toán học, những ngôn ngữ này thường biểu diễn một giá trị dấu phẩy động tương đương với một giá trị phức có phần ảo bằng không.

## Ngôn ngữ hỗ trợ

* Kiểu COMPLEX trong FORTRAN.
* Chuẩn C99 của ngôn ngữ lập trình C cung cấp các kiểu dữ liệu phức và các hàm toán học phức trong thư viện `<[[complex.h]]>`.
* Thư viện chuẩn của C++ cũng cung cấp lớp mẫu `complex` và các hàm toán học phức trong tệp tiêu đề `<complex>`.
* Ngôn ngữ lập trình Go có sẵn các kiểu `complex64` (mỗi thành phần là một số float 32 bit) và `complex128` (mỗi thành phần là một số float 64 bit).
* Mô đun  trong Perl cung cấp khả năng hỗ trợ các số phức.
* Python cung cấp kiểu `complex` được xây dựng sẵn. Các hằng số phức có thể được xác định bằng cách gắn thêm ký tự "j". Các hàm toán học số phức được cung cấp trong mô đun thư viện chuẩn `cmath`.
* Ruby cung cấp lớp  trong mô đun thư viện chuẩn .
* OCaml hỗ trợ số phức thông qua mô đun thư viện chuẩn .
* Haskell hỗ trợ số phức thông qua mô đun thư viện chuẩn  (tên cũ là ).
* Mercury cung cấp khả năng hỗ trợ số phức và nạp chồng toán tử đầy đủ trong bản phân phối mở rộng, sử dụng thư viện .
* Java không có lớp số phức chuẩn, nhưng cũng có một số giải pháp triển khai lớp số phức:
** Thư viện Apache Commons Math cung cấp khả năng hỗ trợ số phức cho Java thông qua lớp .
** Thư viện JScience có chưa lớp số phức .
** Thư viện JAS cho phép sử dụng số phức.
** Netlib có sẵn một lớp số phức cho Java.
** javafastcomplex cũng bổ sung khả năng sử dụng số phức cho Java
** jcomplexnumber là một dự án triển khai số phức bằng Java.
** JLinAlg hỗ trợ các giá trị phức với độ chính xác tùy ý.
* Common Lisp: Chuẩn ANSI Common Lisp hỗ trợ các giá trị phức có các thành phần là số dấu phẩy động, số hữu tỉ hay số nguyên có độ chính xác tùy ý. Các hàm toán học cơ bản đều được định nghĩa cho số phức nếu có thể. Ví dụ, căn bậc hai của -1 là một số phức:
```lisp
? (sqrt -1)
#C(0 1)            ; kết quả của (sqrt -1)
```

* Scheme: Số phức cùng các hàm (v.d. `sin`) đều có sẵn trong ngôn ngữ này. Tuy nhiên việc triển khai chúng chỉ là tùy chọn trong chuẩn R5RS, còn với chuẩn R6RS là bắt buộc. 
* .NET Framework cung cấp thư viện System.Numerics.Complex kể từ phiên bản 4.0.
* smart BASIC dành cho iOS hỗ trợ sẵn số phức theo ký hiệu **a + bi**. Bất cứ biến, phép toán hay hàm nào đều có thể chấp nhận cả các đối số thực và phức và trả về giá trị thực hoặc phức tùy vào kết quả tính toán. Ví dụ, căn bậc hai của -4 là một số phức:
```basic
PRINT SQRT(-4)
2i
```

* Julia có sẵn các kiểu được định trước cho cả số phức và số hữu tỉ kể từ phiên bản 0.3
* R cung cấp kiểu dữ liệu cơ bản `complex`

## Tham khảo