RosettaCodeData/Task/Dot-product/C/dot-product-1.c
2026-04-30 12:34:36 -04:00

37 lines
1.1 KiB
C

#include "array.h"
#define dot(a,b,t,n,i) \
({ \
static_assert((isarray(a) || isvector(a)), \
"ERROR: dot - a is not of array or vector type!"); \
static_assert((isarray(b) || isvector(b)), \
"ERROR: dot - b is not of array or vector type!"); \
t _dst = (t)i; \
size_t len = (size_t)llabs((ssize_t)n); \
len = MIN(MIN(!isarray(a) ? vec_countof(a) : countof(a), \
!isarray(b) ? vec_countof(b) : countof(b)), \
(ssize_t)n>0?len:0); \
_Pragma("omp simd reduction(+:_dst)") \
for(size_t j = 0; j < len; j++) \
_dst += (t)((a)[j]) * (t)((b)[j]); \
_dst; \
})
typedef double real;
#define dot3(a,b) dot(a,b,real,3,0)
#define dot4(a,b) dot(a,b,real,4,0)
#define out_eol puts("")
#define fout_num(stream,prefix,number,suffix) fprintf(stream, "%s%+e%s", prefix, (double)number, suffix)
#define out_num(number) fout_num(stdout,"",number,"")
int main(int argc, char** argv)
{
vec(real,3) a = { 1, 3, -5};
arr(real,3) b = { 4, -2, -1};
out_num(dot3(a, b)); out_eol;
exit(EXIT_SUCCESS);
}