1
1
#include < sleef.h>
2
2
#include < sleefquad.h>
3
+ #include < cmath>
3
4
4
- typedef int (*unary_op_def)(Sleef_quad *, Sleef_quad *);
5
+ // Unary Quad Operations
6
+ typedef int (*unary_op_quad_def)(Sleef_quad *, Sleef_quad *);
5
7
6
- static inline int
8
+ static int
7
9
quad_negative (Sleef_quad *op, Sleef_quad *out)
8
10
{
9
11
*out = Sleef_negq1 (*op);
@@ -108,8 +110,116 @@ quad_exp2(Sleef_quad *op, Sleef_quad *out)
108
110
return 0 ;
109
111
}
110
112
111
- // binary ops
112
- typedef int (*binop_def)(Sleef_quad *, Sleef_quad *, Sleef_quad *);
113
+ // Unary long double operations
114
+ typedef int (*unary_op_longdouble_def)(long double *, long double *);
115
+
116
+ static int
117
+ ld_negative (long double *op, long double *out)
118
+ {
119
+ *out = -(*op);
120
+ return 0 ;
121
+ }
122
+
123
+ static int
124
+ ld_positive (long double *op, long double *out)
125
+ {
126
+ *out = *op;
127
+ return 0 ;
128
+ }
129
+
130
+ static inline int
131
+ ld_absolute (long double *op, long double *out)
132
+ {
133
+ *out = fabsl (*op);
134
+ return 0 ;
135
+ }
136
+
137
+ static inline int
138
+ ld_rint (long double *op, long double *out)
139
+ {
140
+ *out = rintl (*op);
141
+ return 0 ;
142
+ }
143
+
144
+ static inline int
145
+ ld_trunc (long double *op, long double *out)
146
+ {
147
+ *out = truncl (*op);
148
+ return 0 ;
149
+ }
150
+
151
+ static inline int
152
+ ld_floor (long double *op, long double *out)
153
+ {
154
+ *out = floorl (*op);
155
+ return 0 ;
156
+ }
157
+
158
+ static inline int
159
+ ld_ceil (long double *op, long double *out)
160
+ {
161
+ *out = ceill (*op);
162
+ return 0 ;
163
+ }
164
+
165
+ static inline int
166
+ ld_sqrt (long double *op, long double *out)
167
+ {
168
+ *out = sqrtl (*op);
169
+ return 0 ;
170
+ }
171
+
172
+ static inline int
173
+ ld_square (long double *op, long double *out)
174
+ {
175
+ *out = (*op) * (*op);
176
+ return 0 ;
177
+ }
178
+
179
+ static inline int
180
+ ld_log (long double *op, long double *out)
181
+ {
182
+ *out = logl (*op);
183
+ return 0 ;
184
+ }
185
+
186
+ static inline int
187
+ ld_log2 (long double *op, long double *out)
188
+ {
189
+ *out = log2l (*op);
190
+ return 0 ;
191
+ }
192
+
193
+ static inline int
194
+ ld_log10 (long double *op, long double *out)
195
+ {
196
+ *out = log10l (*op);
197
+ return 0 ;
198
+ }
199
+
200
+ static inline int
201
+ ld_log1p (long double *op, long double *out)
202
+ {
203
+ *out = log1pl (*op);
204
+ return 0 ;
205
+ }
206
+
207
+ static inline int
208
+ ld_exp (long double *op, long double *out)
209
+ {
210
+ *out = expl (*op);
211
+ return 0 ;
212
+ }
213
+
214
+ static inline int
215
+ ld_exp2 (long double *op, long double *out)
216
+ {
217
+ *out = exp2l (*op);
218
+ return 0 ;
219
+ }
220
+
221
+ // Binary Quad operations
222
+ typedef int (*binary_op_quad_def)(Sleef_quad *, Sleef_quad *, Sleef_quad *);
113
223
114
224
static inline int
115
225
quad_add (Sleef_quad *out, Sleef_quad *in1, Sleef_quad *in2)
@@ -167,8 +277,67 @@ quad_maximum(Sleef_quad *out, Sleef_quad *in1, Sleef_quad *in2)
167
277
return 0 ;
168
278
}
169
279
170
- // comparison functions
171
- typedef npy_bool (*cmp_def)(const Sleef_quad *, const Sleef_quad *);
280
+ // Binary long double operations
281
+ typedef int (*binary_op_longdouble_def)(long double *, long double *, long double *);
282
+
283
+ static inline int
284
+ ld_add (long double *out, long double *in1, long double *in2)
285
+ {
286
+ *out = (*in1) + (*in2);
287
+ return 0 ;
288
+ }
289
+
290
+ static inline int
291
+ ld_sub (long double *out, long double *in1, long double *in2)
292
+ {
293
+ *out = (*in1) - (*in2);
294
+ return 0 ;
295
+ }
296
+
297
+ static inline int
298
+ ld_mul (long double *res, long double *a, long double *b)
299
+ {
300
+ *res = (*a) * (*b);
301
+ return 0 ;
302
+ }
303
+
304
+ static inline int
305
+ ld_div (long double *res, long double *a, long double *b)
306
+ {
307
+ *res = (*a) / (*b);
308
+ return 0 ;
309
+ }
310
+
311
+ static inline int
312
+ ld_pow (long double *res, long double *a, long double *b)
313
+ {
314
+ *res = powl (*a, *b);
315
+ return 0 ;
316
+ }
317
+
318
+ static inline int
319
+ ld_mod (long double *res, long double *a, long double *b)
320
+ {
321
+ *res = fmodl (*a, *b);
322
+ return 0 ;
323
+ }
324
+
325
+ static inline int
326
+ ld_minimum (long double *out, long double *in1, long double *in2)
327
+ {
328
+ *out = (*in1 < *in2) ? *in1 : *in2;
329
+ return 0 ;
330
+ }
331
+
332
+ static inline int
333
+ ld_maximum (long double *out, long double *in1, long double *in2)
334
+ {
335
+ *out = (*in1 > *in2) ? *in1 : *in2;
336
+ return 0 ;
337
+ }
338
+
339
+ // comparison quad functions
340
+ typedef npy_bool (*cmp_quad_def)(const Sleef_quad *, const Sleef_quad *);
172
341
173
342
static inline npy_bool
174
343
quad_equal (const Sleef_quad *a, const Sleef_quad *b)
@@ -204,4 +373,43 @@ static inline npy_bool
204
373
quad_greaterequal (const Sleef_quad *a, const Sleef_quad *b)
205
374
{
206
375
return Sleef_icmpgeq1 (*a, *b);
376
+ }
377
+
378
+ // comparison quad functions
379
+ typedef npy_bool (*cmp_londouble_def)(const long double *, const double *);
380
+
381
+ static inline npy_bool
382
+ ld_equal (const long double *a, const long double *b)
383
+ {
384
+ return *a == *b;
385
+ }
386
+
387
+ static inline npy_bool
388
+ ld_notequal (const long double *a, const long double *b)
389
+ {
390
+ return *a != *b;
391
+ }
392
+
393
+ static inline npy_bool
394
+ ld_less (const long double *a, const long double *b)
395
+ {
396
+ return *a < *b;
397
+ }
398
+
399
+ static inline npy_bool
400
+ ld_lessequal (const long double *a, const long double *b)
401
+ {
402
+ return *a <= *b;
403
+ }
404
+
405
+ static inline npy_bool
406
+ ld_greater (const long double *a, const long double *b)
407
+ {
408
+ return *a > *b;
409
+ }
410
+
411
+ static inline npy_bool
412
+ ld_greaterequal (const long double *a, const long double *b)
413
+ {
414
+ return *a >= *b;
207
415
}
0 commit comments