Skip to content

Commit a8701e3

Browse files
committed
Refactor to accept complex numbers and add C implementation
1 parent c30f675 commit a8701e3

File tree

19 files changed

+876
-406
lines changed

19 files changed

+876
-406
lines changed

lib/node_modules/@stdlib/math/base/ops/cadd/README.md

+111-32
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ limitations under the License.
1818
1919
-->
2020

21-
# add
21+
# cadd
2222

23-
> Add two complex numbers.
23+
> Add two double-precision complex floating-point numbers.
2424
2525
<section class="intro">
2626

@@ -36,27 +36,25 @@ limitations under the License.
3636
var cadd = require( '@stdlib/math/base/ops/cadd' );
3737
```
3838

39-
#### cadd( \[out,] re1, im1, re2, im2 )
39+
#### cadd( z1, z2 )
4040

41-
Adds two `complex` numbers where each `complex` number is comprised of a **real** component `re` and an **imaginary** component `im`.
41+
Adds two double-precision complex floating-point numbers.
4242

4343
```javascript
44-
var v = cadd( 5.0, 3.0, -2.0, 1.0 );
45-
// returns [ 3.0, 4.0 ]
46-
```
47-
48-
By default, the function returns real and imaginary components as a two-element `array`. To avoid unnecessary memory allocation, the function supports providing an output (destination) object.
44+
var Complex128 = require( '@stdlib/complex/float64' );
45+
var real = require( '@stdlib/complex/real' );
46+
var imag = require( '@stdlib/complex/imag' );
4947

50-
```javascript
51-
var Float32Array = require( '@stdlib/array/float32' );
48+
var z = new Complex128( -1.5, 2.5 );
5249

53-
var out = new Float32Array( 2 );
50+
var v = cadd( z, z );
51+
// returns <Complex128>
5452

55-
var v = cadd( out, 5.0, 3.0, -2.0, 1.0 );
56-
// returns <Float32Array>[ 3.0, 4.0 ]
53+
var re = real( v );
54+
// returns -3.0
5755

58-
var bool = ( v === out );
59-
// returns true
56+
var im = imag( v );
57+
// returns 5.0
6058
```
6159

6260
</section>
@@ -71,40 +69,121 @@ var bool = ( v === out );
7169

7270
```javascript
7371
var Complex128 = require( '@stdlib/complex/float64' );
74-
var randu = require( '@stdlib/random/base/randu' );
75-
var round = require( '@stdlib/math/base/special/round' );
76-
var real = require( '@stdlib/complex/real' );
77-
var imag = require( '@stdlib/complex/imag' );
72+
var discreteUniform = require( '@stdlib/random/base/discrete-uniform' ).factory;
7873
var cadd = require( '@stdlib/math/base/ops/cadd' );
7974

80-
var re;
81-
var im;
75+
var rand;
8276
var z1;
8377
var z2;
8478
var z3;
85-
var o;
8679
var i;
8780

81+
rand = discreteUniform( -50, 50 );
8882
for ( i = 0; i < 100; i++ ) {
89-
re = round( randu()*100.0 ) - 50.0;
90-
im = round( randu()*100.0 ) - 50.0;
91-
z1 = new Complex128( re, im );
83+
z1 = new Complex128( rand(), rand() );
84+
z2 = new Complex128( rand(), rand() );
85+
z3 = cadd( z1, z2 );
86+
console.log( '(%s) + (%s) = %s', z1.toString(), z2.toString(), z3.toString() );
87+
}
88+
```
9289

93-
re = round( randu()*100.0 ) - 50.0;
94-
im = round( randu()*100.0 ) - 50.0;
95-
z2 = new Complex128( re, im );
90+
</section>
9691

97-
o = cadd( real(z1), imag(z1), real(z2), imag(z2) );
98-
z3 = new Complex128( o[ 0 ], o[ 1 ] );
92+
<!-- /.examples -->
9993

100-
console.log( '(%s) + (%s) = %s', z1.toString(), z2.toString(), z3.toString() );
94+
<!-- C interface documentation. -->
95+
96+
* * *
97+
98+
<section class="c">
99+
100+
## C APIs
101+
102+
<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. -->
103+
104+
<section class="intro">
105+
106+
</section>
107+
108+
<!-- /.intro -->
109+
110+
<!-- C usage documentation. -->
111+
112+
<section class="usage">
113+
114+
### Usage
115+
116+
```c
117+
#include "stdlib/math/base/ops/cadd.h"
118+
```
119+
120+
#### stdlib_base_cadd( z1, z2 )
121+
122+
Adds two double-precision complex floating-point numbers.
123+
124+
```c
125+
#include <complex.h>
126+
127+
double complex z = 2.5 - 1.5*I;
128+
129+
double complex out = stdlib_base_cadd( z, z );
130+
// returns 5.0-3.0*I
131+
```
132+
133+
The function accepts the following arguments:
134+
135+
- **z1**: `[in] double complex` input value.
136+
- **z2**: `[in] double complex` input value.
137+
138+
```c
139+
double complex stdlib_base_cadd( const double complex z, const double complex z );
140+
```
141+
142+
</section>
143+
144+
<!-- /.usage -->
145+
146+
<!-- C API usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
147+
148+
<section class="notes">
149+
150+
</section>
151+
152+
<!-- /.notes -->
153+
154+
<!-- C API usage examples. -->
155+
156+
<section class="examples">
157+
158+
### Examples
159+
160+
```c
161+
#include "stdlib/math/base/special/cadd.h"
162+
#include <stdio.h>
163+
#include <complex.h>
164+
165+
int main() {
166+
double complex x[] = { 3.14+1.5*I, -3.14-1.5*I, 0.0+0.0*I, 0.0/0.0+0.0/0.0*I };
167+
168+
double complex v;
169+
double complex y;
170+
int i;
171+
for ( i = 0; i < 4; i++ ) {
172+
v = x[ i ];
173+
y = stdlib_base_cadd( v, v );
174+
printf( "z = %lf + %lfi\ncadd(z, z) = %lf + %lfi\n", creal( v ), cimag( v ), creal( y ), cimag( y ) );
175+
}
101176
}
102177
```
103178

104179
</section>
105180

106181
<!-- /.examples -->
107182

183+
</section>
184+
185+
<!-- /.c -->
186+
108187
<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->
109188

110189
<section class="related">

lib/node_modules/@stdlib/math/base/ops/cadd/benchmark/benchmark.js

+17-101
Original file line numberDiff line numberDiff line change
@@ -21,123 +21,39 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
25-
var isArray = require( '@stdlib/assert/is-array' );
24+
var uniform = require( '@stdlib/random/base/uniform' );
25+
var isnan = require( '@stdlib/math/base/assert/is-nan' );
26+
var Complex128 = require( '@stdlib/complex/float64' );
27+
var real = require( '@stdlib/complex/real' );
28+
var imag = require( '@stdlib/complex/imag' );
2629
var pkg = require( './../package.json' ).name;
2730
var cadd = require( './../lib' );
2831

2932

3033
// MAIN //
3134

3235
bench( pkg, function benchmark( b ) {
33-
var re1;
34-
var re2;
35-
var im1;
36-
var im2;
37-
var y;
38-
var i;
39-
40-
b.tic();
41-
for ( i = 0; i < b.iterations; i++ ) {
42-
re1 = ( randu()*1000.0 ) - 500.0;
43-
im1 = ( randu()*1000.0 ) - 500.0;
44-
re2 = ( randu()*1000.0 ) - 500.0;
45-
im2 = ( randu()*1000.0 ) - 500.0;
46-
y = cadd( re1, im1, re2, im2 );
47-
if ( y.length === 0 ) {
48-
b.fail( 'should not be empty' );
49-
}
50-
}
51-
b.toc();
52-
if ( !isArray( y ) ) {
53-
b.fail( 'should return an array' );
54-
}
55-
b.pass( 'benchmark finished' );
56-
b.end();
57-
});
58-
59-
bench( pkg+'::memory_reuse', function benchmark( b ) {
60-
var re1;
61-
var re2;
62-
var im1;
63-
var im2;
36+
var values;
6437
var out;
65-
var y;
66-
var i;
67-
68-
out = [ 0.0, 0.0 ];
69-
70-
b.tic();
71-
for ( i = 0; i < b.iterations; i++ ) {
72-
re1 = ( randu()*1000.0 ) - 500.0;
73-
im1 = ( randu()*1000.0 ) - 500.0;
74-
re2 = ( randu()*1000.0 ) - 500.0;
75-
im2 = ( randu()*1000.0 ) - 500.0;
76-
y = cadd( out, re1, im1, re2, im2 );
77-
if ( y.length === 0 ) {
78-
b.fail( 'should not be empty' );
79-
}
80-
}
81-
b.toc();
82-
if ( !isArray( y ) ) {
83-
b.fail( 'should return an array' );
84-
}
85-
b.pass( 'benchmark finished' );
86-
b.end();
87-
});
88-
89-
bench( pkg+'::built-in', function benchmark( b ) {
90-
var re1;
91-
var re2;
92-
var im1;
93-
var im2;
94-
var y;
95-
var i;
96-
97-
b.tic();
98-
for ( i = 0; i < b.iterations; i++ ) {
99-
re1 = ( randu()*1000.0 ) - 500.0;
100-
im1 = ( randu()*1000.0 ) - 500.0;
101-
re2 = ( randu()*1000.0 ) - 500.0;
102-
im2 = ( randu()*1000.0 ) - 500.0;
103-
y = [ re1+re2, im1+im2 ];
104-
if ( y.length === 0 ) {
105-
b.fail( 'should not be empty' );
106-
}
107-
}
108-
b.toc();
109-
if ( !isArray( y ) ) {
110-
b.fail( 'should return an array' );
111-
}
112-
b.pass( 'benchmark finished' );
113-
b.end();
114-
});
115-
116-
bench( pkg+'::built-in,memory_reuse', function benchmark( b ) {
117-
var re1;
118-
var re2;
119-
var im1;
120-
var im2;
121-
var y;
38+
var z;
12239
var i;
12340

124-
y = [ 0.0, 0.0 ];
41+
values = [
42+
new Complex128( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) ),
43+
new Complex128( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) )
44+
];
12545

12646
b.tic();
12747
for ( i = 0; i < b.iterations; i++ ) {
128-
re1 = ( randu()*1000.0 ) - 500.0;
129-
im1 = ( randu()*1000.0 ) - 500.0;
130-
re2 = ( randu()*1000.0 ) - 500.0;
131-
im2 = ( randu()*1000.0 ) - 500.0;
132-
y[ 0 ] = re1 + re2;
133-
y[ 1 ] = im1 + im2;
134-
if ( y.length === 0 ) {
135-
b.fail( 'should not be empty' );
48+
z = values[ i%values.length ];
49+
out = cadd( z, z );
50+
if ( typeof out !== 'object' ) {
51+
b.fail( 'should return an object' );
13652
}
13753
}
13854
b.toc();
139-
if ( !isArray( y ) ) {
140-
b.fail( 'should return an array' );
55+
if ( isnan( real( out ) ) || isnan( imag( out ) ) ) {
56+
b.fail( 'should not return NaN' );
14157
}
14258
b.pass( 'benchmark finished' );
14359
b.end();

lib/node_modules/@stdlib/math/base/ops/cadd/benchmark/c/benchmark.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include <complex.h>
2626
#include <sys/time.h>
2727

28-
#define NAME "add"
28+
#define NAME "cadd"
2929
#define ITERATIONS 1000000
3030
#define REPEATS 3
3131

0 commit comments

Comments
 (0)