aboutsummaryrefslogtreecommitdiff
path: root/core/c/libc/complex.odin
blob: 98fd7b1bb6017f83da4e212ec102cb260ce2a5b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package libc

// 7.3 Complex arithmetic

when ODIN_OS == .Windows {
	foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
	foreign import libc "system:System.framework"
} else {
	foreign import libc "system:c"
}

@(default_calling_convention="c")
foreign libc {
	// 7.3.5 Trigonometric functions
	cacos   :: proc(z: complex_double) -> complex_double ---
	cacosf  :: proc(z: complex_float) -> complex_float ---
	casin   :: proc(z: complex_double) -> complex_double ---
	casinf  :: proc(z: complex_float) -> complex_float ---
	catan   :: proc(z: complex_double) -> complex_double ---
	catanf  :: proc(z: complex_float) -> complex_float ---
	ccos    :: proc(z: complex_double) -> complex_double ---
	ccosf   :: proc(z: complex_float) -> complex_float ---
	csin    :: proc(z: complex_double) -> complex_double ---
	csinf   :: proc(z: complex_float) -> complex_float ---
	ctan    :: proc(z: complex_double) -> complex_double ---
	ctanf   :: proc(z: complex_float) -> complex_float ---

	// 7.3.6 Hyperbolic functions
	cacosh  :: proc(z: complex_double) -> complex_double ---
	cacoshf :: proc(z: complex_float) -> complex_float ---
	casinh  :: proc(z: complex_double) -> complex_double ---
	casinhf :: proc(z: complex_float) -> complex_float ---
	catanh  :: proc(z: complex_double) -> complex_double ---
	catanhf :: proc(z: complex_float) -> complex_float ---
	ccosh   :: proc(z: complex_double) -> complex_double ---
	ccoshf  :: proc(z: complex_float) -> complex_float ---
	csinh   :: proc(z: complex_double) -> complex_double ---
	csinhf  :: proc(z: complex_float) -> complex_float ---
	ctanh   :: proc(z: complex_double) -> complex_double ---
	ctanhf  :: proc(z: complex_float) -> complex_float ---

	// 7.3.7 Exponential and logarithmic functions
	cexp    :: proc(z: complex_double) -> complex_double ---
	cexpf   :: proc(z: complex_float) -> complex_float ---
	clog    :: proc(z: complex_double) -> complex_double ---
	clogf   :: proc(z: complex_float) -> complex_float ---

	// 7.3.8 Power and absolute-value functions
	cabs    :: proc(z: complex_double) -> double ---
	cabsf   :: proc(z: complex_float) -> float ---
	cpow    :: proc(x, y: complex_double) -> complex_double ---
	cpowf   :: proc(x, y: complex_float) -> complex_float ---
	csqrt   :: proc(z: complex_double) -> complex_double ---
	csqrtf  :: proc(z: complex_float) -> complex_float ---

	// 7.3.9 Manipulation functions
	carg    :: proc(z: complex_double) -> double ---
	cargf   :: proc(z: complex_float) -> float ---
	cimag   :: proc(z: complex_double) -> double ---
	cimagf  :: proc(z: complex_float) -> float ---
	conj    :: proc(z: complex_double) -> complex_double ---
	conjf   :: proc(z: complex_float) -> complex_float ---
	cproj   :: proc(z: complex_double) -> complex_double ---
	cprojf  :: proc(z: complex_float) -> complex_float ---
	creal   :: proc(z: complex_double) -> double ---
	crealf  :: proc(z: complex_float) -> float ---
}

import builtin "base:builtin"

complex_float  :: distinct builtin.complex64
complex_double :: distinct builtin.complex128

// Cannot implement _Complex_I or _Imaginary_I in Odin, thus
// complex and imaginary cannot be implement either.

CMPLX :: #force_inline proc(x, y: double) -> complex_double {
	return builtin.complex(x, y)
}

CMPLXF :: #force_inline proc(x, y: float) -> complex_float {
	return builtin.complex(x, y)
}