TPCCLIB
Loading...
Searching...
No Matches
doubleutil.c
Go to the documentation of this file.
1
5/*****************************************************************************/
6
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <time.h>
13#include <string.h>
14#include <ctype.h>
15#include <unistd.h>
16#include <math.h>
17#include "tpcextensions.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
29 const double v1,
31 const double v2,
33 const double lim
34) {
35 if(isnan(v1) && isnan(v2)) return 1;
36 if(isnan(v1) || isnan(v2)) return 0;
37 if(v1==v2) return 1;
38 if(isnan(lim) || lim<0.0) return 0;
39 if(fabs(v1-v2)<=lim) return 1;
40 return 0;
41}
42/*****************************************************************************/
43
44/*****************************************************************************/
53 const double *a1,
55 const double *a2,
57 const unsigned int n,
59 const double lim
60) {
61 if(a1==NULL || a2==NULL || n<1) return 0;
62 for(unsigned int i=0; i<n; i++) if(!doubleMatch(a1[i], a2[i], lim)) return 0;
63 return 1;
64}
65/*****************************************************************************/
66
67/*****************************************************************************/
79 const double v1,
81 const double v2,
83 const double lim
84) {
85 if(isnan(v1) && isnan(v2)) return 1;
86 if(isnan(v1) || isnan(v2)) return 0;
87 if(v1==v2) return 1;
88 if(isnan(lim)) return 0;
89 double mean;
90 mean=0.5*(v1+v2); if(!isnormal(mean)) return 0;
91 if(fabs((v1-v2)/mean)<=lim) return 1;
92 return 0;
93}
94/*****************************************************************************/
95
96/*****************************************************************************/
106{
107 double macheps=1.0;
108 do {macheps/=2.0;} while((1.0+macheps/2.0)!=1.0);
109 return(macheps);
110}
111/*****************************************************************************/
112
113/*****************************************************************************/
119 double *t,
121 double *s,
123 const unsigned int n
124) {
125 unsigned int i;
126 if(t==NULL || s==NULL || n<1) return;
127 for(i=0; i<n; i++) t[i]=s[i];
128}
129/*****************************************************************************/
130
131/*****************************************************************************/
136unsigned int doubleCopyFinite(
138 double *t,
140 double *s,
142 const unsigned int n
143) {
144 unsigned int i, tn=0;
145 if(t==NULL || s==NULL || n<1) return(0);
146 for(i=0; i<n; i++) if(isfinite(s[i])) t[tn++]=s[i];
147 return(tn);
148}
149/*****************************************************************************/
150
151/*****************************************************************************/
156unsigned int doubleNaNs(
158 double *a,
160 const unsigned int n
161) {
162 if(a==NULL || n<1) return(0);
163 unsigned int i, nn=0;
164 for(i=0; i<n; i++) if(isnan(a[i])) nn++;
165 return(nn);
166}
167/*****************************************************************************/
168
169/*****************************************************************************/
174unsigned int doubleRange(
176 double *a,
178 const unsigned int n,
180 double *amin,
182 double *amax
183) {
184 if(amin!=NULL) *amin=nan("");
185 if(amax!=NULL) *amax=nan("");
186 if(a==NULL || n<1) return(0);
187
188 double mi=nan(""), ma=nan("");
189 unsigned int i, nn=0;
190 for(i=0; i<n; i++) if(isfinite(a[i])) {
191 nn++;
192 if(!isfinite(mi) || mi>a[i]) mi=a[i];
193 if(!isfinite(ma) || ma<a[i]) ma=a[i];
194 }
195 if(amin!=NULL) *amin=mi;
196 if(amax!=NULL) *amax=ma;
197 return(nn);
198}
199/*****************************************************************************/
200
201/*****************************************************************************/
208 double *a,
210 const unsigned int n
211) {
212 double s=0.0;
213 if(a==NULL || n<1) return(s);
214 for(unsigned int i=0; i<n; i++) if(!isnan(a[i])) s+=a[i];
215 return(s);
216}
217/*****************************************************************************/
218
219/*****************************************************************************/
226 double *a,
228 const unsigned int n
229) {
230 if(a==NULL || n<1) return(nan(""));
231 double s=0.0;
232 unsigned int i, ci=0;
233 for(i=0; i<n; i++) if(!isnan(a[i])) {ci++; s+=a[i];}
234 if(ci<1) return(nan(""));
235 return(s/(double)ci);
236}
237/*****************************************************************************/
238
239/*****************************************************************************/
246 double *a,
249 double *w,
251 const unsigned int n
252) {
253 if(a==NULL || w==NULL || n<1) return(nan(""));
254 double s=0.0, ws=0.0;
255 unsigned int i, ci=0;
256 for(i=0; i<n; i++) if(isnormal(a[i]) && isnormal(w[i]) && w[i]>0.0) {
257 ci++; s+=w[i]*a[i]; ws+=w[i];}
258 if(ci<1 || !(ws>0.0)) return(nan(""));
259 return(s/ws);
260}
261/*****************************************************************************/
262
263/*****************************************************************************/
275 const char *s,
277 double *v,
279 int *u
280) {
281 if(v!=NULL) *v=nan("");
282 if(u!=NULL) *u=UNIT_UNKNOWN;
283 if(s==NULL) return 1;
284 int n=strTokenNr(s, " \t"); if(n==0 || n>2) return 1;
285 if(n==1) return(atofCheck(s, v)); // no unit
286 /* separate number and unit */
287 char buf[64];
288 n=strTokenNCpy(s, " \t", 1, buf, 64);
289 if(atofCheck(buf, v)) return 1;
290 if(u==NULL) return 0;
291 n=strTokenNCpy(s, " \t", 2, buf, 64);
292 *u=unitIdentify(buf);
293 return 0;
294}
295/*****************************************************************************/
296
297/*****************************************************************************/
304 double *a,
306 const int n
307) {
308 if(a==NULL || n<1) return(0);
309 int i=0;
310 for(i=0; i<n; i++) if(!(a[i]>0.0)) break;
311 return(i);
312}
313/*****************************************************************************/
314
315/*****************************************************************************/
322 double *a,
324 const int n
325) {
326 if(a==NULL || n<1) return(0);
327 int i=0;
328 for(i=0; i<n; i++) if(a[i]>0.0) break;
329 return(i);
330}
331/*****************************************************************************/
332
333/*****************************************************************************/
339unsigned int doubleNonzeroes(
341 double *a,
343 const unsigned int n
344) {
345 if(a==NULL || n<1) return(0);
346 unsigned int i, m=0;
347 for(i=0; i<n; i++) if(fabs(a[i])>0.0) m++;
348 return(m);
349}
350/*****************************************************************************/
351
352/*****************************************************************************/
357unsigned int doubleMaxIndex(
359 double *a,
361 const unsigned int n
362) {
363 if(a==NULL || n<1) return(0);
364 unsigned int i, mi=0;
365 double mv=nan("");
366 for(i=0; i<n; i++) if(isnan(mv) || a[i]>mv) {mv=a[i]; mi=i;}
367 return(mi);
368}
369/*****************************************************************************/
370
371/*****************************************************************************/
377unsigned int doubleAbsMaxIndex(
379 double *a,
381 const unsigned int n
382) {
383 if(a==NULL || n<1) return(0);
384 unsigned int i, mi=0;
385 double mv=nan("");
386 for(i=0; i<n; i++) if(isnan(mv) || fabs(a[i])>mv) {mv=fabs(a[i]); mi=i;}
387 return(mi);
388}
389/*****************************************************************************/
390
391/*****************************************************************************/
396unsigned int doubleMinIndex(
398 double *a,
400 const unsigned int n
401) {
402 if(a==NULL || n<1) return(0);
403 unsigned int i, mi=0;
404 double mv=nan("");
405 for(i=0; i<n; i++) if(isnan(mv) || a[i]<mv) {mv=a[i]; mi=i;}
406 return(mi);
407}
408/*****************************************************************************/
409
410/*****************************************************************************/
416unsigned int doubleAbsMinIndex(
418 double *a,
420 const unsigned int n
421) {
422 if(a==NULL || n<1) return(0);
423 unsigned int i, mi=0;
424 double mv=nan("");
425 for(i=0; i<n; i++) if(isnan(mv) || fabs(a[i])<mv) {mv=fabs(a[i]); mi=i;}
426 return(mi);
427}
428/*****************************************************************************/
429
430/*****************************************************************************/
435unsigned int doubleGEIndex(
437 double *a,
439 const unsigned int n,
441 double lim
442) {
443 if(a==NULL || n<1) return(n);
444 for(unsigned int i=0; i<n; i++) if(a[i]>=lim) return(i);
445 return(n);
446}
447/*****************************************************************************/
452unsigned int doubleGTIndex(
454 double *a,
456 const unsigned int n,
458 double lim
459) {
460 if(a==NULL || n<1) return(n);
461 for(unsigned int i=0; i<n; i++) if(a[i]>lim) return(i);
462 return(n);
463}
464/*****************************************************************************/
465
466/*****************************************************************************/
473double inverfc(
475 double x
476) {
477 static const double a[] = {
478 -3.969683028665376E+01, 2.209460984245205E+02, -2.759285104469687E+02,
479 1.383577518672690E+02, -3.066479806614716E+01, 2.506628277459239
480 };
481 static const double b[] = {
482 -5.447609879822406E+01, 1.615858368580409E+02, -1.556989798598866E+02,
483 6.680131188771972E+01, -1.328068155288572E+01
484 };
485 static const double c[] = {
486 -7.784894002430293E-03, -3.223964580411365E-01, -2.400758277161838,
487 -2.549732539343734, 4.374664141464968, 2.938163982698783
488 };
489 static const double d[] = {
490 7.784695709041462E-03, 3.224671290700398E-01, 2.445134137142996, 3.754408661907416
491 };
492 double y, e, u;
493 x/=2.0;
494 if(x<0.02425) {
495 double q=sqrt(-2.0 * log(x));
496 y = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5])
497 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
498 } else if(x<=0.97575) {
499 double q=x-0.5;
500 double r=q*q;
501 y = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5])*q
502 / (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1.0);
503 } else {
504 double q=sqrt(-2.0 * log(1.0-x));
505 y = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5])
506 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
507 }
508 e=0.5*erfc(-y/M_SQRT2)-x;
509 u=(e)*M_SQRT2*M_PI*exp(0.5*y*y);
510 y-=u/(1.0 + 0.5*y*u);
511 return(fabs(y/M_SQRT2));
512}
513/*****************************************************************************/
514
515/*****************************************************************************/
int atofCheck(const char *s, double *v)
Definition decpoint.c:94
unsigned int doubleNonzeroes(double *a, const unsigned int n)
Definition doubleutil.c:339
unsigned int doubleNaNs(double *a, const unsigned int n)
Definition doubleutil.c:156
int doubleGetWithUnit(const char *s, double *v, int *u)
Definition doubleutil.c:272
int doubleSpanPositives(double *a, const int n)
Definition doubleutil.c:302
unsigned int doubleAbsMinIndex(double *a, const unsigned int n)
Definition doubleutil.c:416
double doubleMachEps()
Definition doubleutil.c:105
unsigned int doubleGEIndex(double *a, const unsigned int n, double lim)
Definition doubleutil.c:435
int doubleCSpanPositives(double *a, const int n)
Definition doubleutil.c:320
int doubleMatch(const double v1, const double v2, const double lim)
Definition doubleutil.c:27
int doubleMatchRel(const double v1, const double v2, const double lim)
Definition doubleutil.c:77
double doubleWMean(double *a, double *w, const unsigned int n)
Definition doubleutil.c:244
unsigned int doubleMaxIndex(double *a, const unsigned int n)
Definition doubleutil.c:357
double inverfc(double x)
Definition doubleutil.c:473
int doubleArrayMatch(const double *a1, const double *a2, const unsigned int n, const double lim)
Definition doubleutil.c:51
unsigned int doubleCopyFinite(double *t, double *s, const unsigned int n)
Definition doubleutil.c:136
unsigned int doubleRange(double *a, const unsigned int n, double *amin, double *amax)
Definition doubleutil.c:174
unsigned int doubleAbsMaxIndex(double *a, const unsigned int n)
Definition doubleutil.c:377
unsigned int doubleGTIndex(double *a, const unsigned int n, double lim)
Definition doubleutil.c:452
double doubleSum(double *a, const unsigned int n)
Definition doubleutil.c:206
void doubleCopy(double *t, double *s, const unsigned int n)
Definition doubleutil.c:117
double doubleMean(double *a, const unsigned int n)
Definition doubleutil.c:224
unsigned int doubleMinIndex(double *a, const unsigned int n)
Definition doubleutil.c:396
int strTokenNr(const char *s1, const char *s2)
Definition stringext.c:25
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
Definition stringext.c:53
Header file for library libtpcextensions.
@ UNIT_UNKNOWN
Unknown unit.
int unitIdentify(const char *s)
Definition units.c:162