File: complex-arithmetic.c

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (115 lines) | stat: -rw-r--r-- 3,098 bytes parent folder | download | duplicates (3)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// RUN: %clang_cc1 -verify %s
// expected-no-diagnostics

// This tests evaluation of _Complex arithmetic at compile time.

#define APPROX_EQ(a, b) (                             \
  __builtin_fabs(__real (a) - __real (b)) < 0.0001 && \
  __builtin_fabs(__imag (a) - __imag (b)) < 0.0001    \
)

#define EVAL(a, b) _Static_assert(a == b, "")
#define EVALF(a, b) _Static_assert(APPROX_EQ(a, b), "")

// _Complex float + _Complex float
void a() {
  EVALF((2.f + 3i) + (4.f + 5i), 6.f + 8i);
  EVALF((2.f + 3i) - (4.f + 5i), -2.f - 2i);
  EVALF((2.f + 3i) * (4.f + 5i), -7.f + 22i);
  EVALF((2.f + 3i) / (4.f + 5i), 0.5609f + 0.0487i);

  EVALF((2. + 3i) + (4. + 5i), 6. + 8i);
  EVALF((2. + 3i) - (4. + 5i), -2. - 2i);
  EVALF((2. + 3i) * (4. + 5i), -7. + 22i);
  EVALF((2. + 3i) / (4. + 5i), .5609 + .0487i);
}

// _Complex int + _Complex int
void b() {
  EVAL((2 + 3i) + (4 + 5i), 6 + 8i);
  EVAL((2 + 3i) - (4 + 5i), -2 - 2i);
  EVAL((2 + 3i) * (4 + 5i), -7 + 22i);
  EVAL((8 + 30i) / (4 + 5i), 4 + 1i);
}

// _Complex float + float
void c() {
  EVALF((2.f + 4i) + 3.f, 5.f + 4i);
  EVALF((2.f + 4i) - 3.f, -1.f + 4i);
  EVALF((2.f + 4i) * 3.f, 6.f + 12i);
  EVALF((2.f + 4i) / 2.f, 1.f + 2i);

  EVALF(3.f + (2.f + 4i), 5.f + 4i);
  EVALF(3.f - (2.f + 4i), 1.f - 4i);
  EVALF(3.f * (2.f + 4i), 6.f + 12i);
  EVALF(3.f / (2.f + 4i), .3f - 0.6i);

  EVALF((2. + 4i) + 3., 5. + 4i);
  EVALF((2. + 4i) - 3., -1. + 4i);
  EVALF((2. + 4i) * 3., 6. + 12i);
  EVALF((2. + 4i) / 2., 1. + 2i);

  EVALF(3. + (2. + 4i), 5. + 4i);
  EVALF(3. - (2. + 4i), 1. - 4i);
  EVALF(3. * (2. + 4i), 6. + 12i);
  EVALF(3. / (2. + 4i), .3 - 0.6i);
}

// _Complex int + int
void d() {
  EVAL((2 + 4i) + 3, 5 + 4i);
  EVAL((2 + 4i) - 3, -1 + 4i);
  EVAL((2 + 4i) * 3, 6 + 12i);
  EVAL((2 + 4i) / 2, 1 + 2i);

  EVAL(3 + (2 + 4i), 5 + 4i);
  EVAL(3 - (2 + 4i), 1 - 4i);
  EVAL(3 * (2 + 4i), 6 + 12i);
  EVAL(20 / (2 + 4i), 2 - 4i);
}

// _Complex float + int
void e() {
  EVALF((2.f + 4i) + 3, 5.f + 4i);
  EVALF((2.f + 4i) - 3, -1.f + 4i);
  EVALF((2.f + 4i) * 3, 6.f + 12i);
  EVALF((2.f + 4i) / 2, 1.f + 2i);

  EVALF(3 + (2.f + 4i), 5.f + 4i);
  EVALF(3 - (2.f + 4i), 1.f - 4i);
  EVALF(3 * (2.f + 4i), 6.f + 12i);
  EVALF(3 / (2.f + 4i), .3f - 0.6i);

  EVALF((2. + 4i) + 3, 5. + 4i);
  EVALF((2. + 4i) - 3, -1. + 4i);
  EVALF((2. + 4i) * 3, 6. + 12i);
  EVALF((2. + 4i) / 2, 1. + 2i);

  EVALF(3 + (2. + 4i), 5. + 4i);
  EVALF(3 - (2. + 4i), 1. - 4i);
  EVALF(3 * (2. + 4i), 6. + 12i);
  EVALF(3 / (2. + 4i), .3 - 0.6i);
}

// _Complex int + float
void f() {
  EVALF((2 + 4i) + 3.f, 5.f + 4i);
  EVALF((2 + 4i) - 3.f, -1.f + 4i);
  EVALF((2 + 4i) * 3.f, 6.f + 12i);
  EVALF((2 + 4i) / 2.f, 1.f + 2i);

  EVALF(3.f + (2 + 4i), 5.f + 4i);
  EVALF(3.f - (2 + 4i), 1.f - 4i);
  EVALF(3.f * (2 + 4i), 6.f + 12i);
  EVALF(3.f / (2 + 4i), .3f - 0.6i);

  EVALF((2 + 4i) + 3., 5. + 4i);
  EVALF((2 + 4i) - 3., -1. + 4i);
  EVALF((2 + 4i) * 3., 6. + 12i);
  EVALF((2 + 4i) / 2., 1. + 2i);

  EVALF(3. + (2 + 4i), 5. + 4i);
  EVALF(3. - (2 + 4i), 1. - 4i);
  EVALF(3. * (2 + 4i), 6. + 12i);
  EVALF(3. / (2 + 4i), .3 - 0.6i);
}