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 "libtpcmisc.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
30 const double v1,
32 const double v2,
34 const double lim
35) {
36 if(isnan(v1) && isnan(v2)) return 1;
37 if(isnan(v1) || isnan(v2)) return 0;
38 if(v1==v2) return 1;
39 if(isnan(lim) || lim<0.0) return 0;
40 if(fabs(v1-v2)<=lim) return 1;
41 return 0;
42}
43/*****************************************************************************/
44
45/*****************************************************************************/
57 const double v1,
59 const double v2,
61 const double lim
62) {
63 if(isnan(v1) && isnan(v2)) return 1;
64 if(isnan(v1) || isnan(v2)) return 0;
65 if(v1==v2) return 1;
66 if(isnan(lim)) return 0;
67 double mean;
68 mean=0.5*(v1+v2); if(!isnormal(mean)) return 0;
69 if(fabs((v1-v2)/mean)<=lim) return 1;
70 return 0;
71}
72/*****************************************************************************/
73
74/*****************************************************************************/
84{
85 double macheps=1.0;
86 do {macheps/=2.0;} while((1.0+macheps/2.0)!=1.0);
87 return(macheps);
88}
89/*****************************************************************************/
90
91/*****************************************************************************/
95 double *t,
97 double *s,
99 const unsigned int n
100) {
101 unsigned int i;
102 if(t==NULL || s==NULL || n<1) return;
103 for(i=0; i<n; i++) t[i]=s[i];
104}
105/*****************************************************************************/
106
107/*****************************************************************************/
111unsigned int doubleMaxIndex(
113 double *a,
115 const unsigned int n
116) {
117 if(a==NULL || n<1) return(0);
118 unsigned int i, mi=0;
119 double mv=nan("");
120 for(i=0; i<n; i++) if(isnan(mv) || a[i]>mv) {mv=a[i]; mi=i;}
121 return(mi);
122}
123/*****************************************************************************/
124
125/*****************************************************************************/
132 double *a,
134 const unsigned int n
135) {
136 double s=0.0;
137 if(a==NULL || n<1) return(s);
138 for(unsigned int i=0; i<n; i++) if(!isnan(a[i])) s+=a[i];
139 return(s);
140}
141/*****************************************************************************/
142
143/*****************************************************************************/
150 double *a,
152 const unsigned int n
153) {
154 if(a==NULL || n<1) return(nan(""));
155 double s=0.0;
156 unsigned int i, ci=0;
157 for(i=0; i<n; i++) if(!isnan(a[i])) {ci++; s+=a[i];}
158 if(ci<1) return(nan(""));
159 return(s/(double)ci);
160}
161/*****************************************************************************/
162
163/*****************************************************************************/
170 double *a,
172 const int n
173) {
174 if(a==NULL || n<1) return(0);
175 int i=0;
176 for(i=0; i<n; i++) if(!(a[i]>0.0)) break;
177 return(i);
178}
179/*****************************************************************************/
180
181/*****************************************************************************/
188 double *a,
190 const int n
191) {
192 if(a==NULL || n<1) return(0);
193 int i=0;
194 for(i=0; i<n; i++) if(a[i]>0.0) break;
195 return(i);
196}
197/*****************************************************************************/
198
199/*****************************************************************************/
205double inverfc(
207 double x
208) {
209 static const double a[] = {
210 -3.969683028665376E+01, 2.209460984245205E+02, -2.759285104469687E+02,
211 1.383577518672690E+02, -3.066479806614716E+01, 2.506628277459239
212 };
213 static const double b[] = {
214 -5.447609879822406E+01, 1.615858368580409E+02, -1.556989798598866E+02,
215 6.680131188771972E+01, -1.328068155288572E+01
216 };
217 static const double c[] = {
218 -7.784894002430293E-03, -3.223964580411365E-01, -2.400758277161838,
219 -2.549732539343734, 4.374664141464968, 2.938163982698783
220 };
221 static const double d[] = {
222 7.784695709041462E-03, 3.224671290700398E-01, 2.445134137142996, 3.754408661907416
223 };
224 double y, e, u;
225 x/=2.0;
226 if(x<0.02425) {
227 double q=sqrt(-2.0 * log(x));
228 y = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5])
229 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
230 } else if(x<=0.97575) {
231 double q=x-0.5;
232 double r=q*q;
233 y = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5])*q
234 / (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1.0);
235 } else {
236 double q=sqrt(-2.0 * log(1.0-x));
237 y = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5])
238 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
239 }
240 e=0.5*erfc(-y/M_SQRT2)-x;
241 u=(e)*M_SQRT2*M_PI*exp(0.5*y*y);
242 y-=u/(1.0 + 0.5*y*u);
243 return(fabs(y/M_SQRT2));
244}
245/*****************************************************************************/
246
247/*****************************************************************************/
249/* Local functions */
250static int statDoubleCompAsc(const void *i, const void *j)
251{
252 const double *di = (const double *)i;
253 const double *dj = (const double *)j;
254 return(*di > *dj) - (*di < *dj);
255}
256static int statDoubleCompDesc(const void *i, const void *j)
257{
258 const double *di = (const double *)i;
259 const double *dj = (const double *)j;
260 return(*di < *dj) - (*di > *dj);
261}
263
269 double *data,
271 unsigned int n,
273 int order
274) {
275 if(n<2 || data==NULL) return;
276 if(order==0) qsort(data, n, sizeof(double), statDoubleCompAsc);
277 else qsort(data, n, sizeof(float), statDoubleCompDesc);
278}
279/*****************************************************************************/
280
281/*****************************************************************************/
283/* Local functions */
284static int statFloatCompAsc(const void *i, const void *j)
285{
286 const float *di = (const float *)i;
287 const float *dj = (const float *)j;
288 return(*di > *dj) - (*di < *dj);
289}
290static int statFloatCompDesc(const void *i, const void *j)
291{
292 const float *di = (const float *)i;
293 const float *dj = (const float *)j;
294 return(*di < *dj) - (*di > *dj);
295}
297
303 float *data,
305 unsigned int n,
307 int order
308) {
309 if(n<2 || data==NULL) return;
310 if(order==0) qsort(data, n, sizeof(float), statFloatCompAsc);
311 else qsort(data, n, sizeof(float), statFloatCompDesc);
312}
313/*****************************************************************************/
314
315/*****************************************************************************/
int doubleSpanPositives(double *a, const int n)
Definition doubleutil.c:168
double doubleMachEps()
Definition doubleutil.c:83
int doubleCSpanPositives(double *a, const int n)
Definition doubleutil.c:186
int doubleMatch(const double v1, const double v2, const double lim)
Definition doubleutil.c:28
int doubleMatchRel(const double v1, const double v2, const double lim)
Definition doubleutil.c:55
unsigned int doubleMaxIndex(double *a, const unsigned int n)
Definition doubleutil.c:111
double inverfc(double x)
Definition doubleutil.c:205
void statSortDouble(double *data, unsigned int n, int order)
Definition doubleutil.c:267
double doubleSum(double *a, const unsigned int n)
Definition doubleutil.c:130
void doubleCopy(double *t, double *s, const unsigned int n)
Definition doubleutil.c:93
double doubleMean(double *a, const unsigned int n)
Definition doubleutil.c:148
void statSortFloat(float *data, unsigned int n, int order)
Definition doubleutil.c:301
Header file for libtpcmisc.
int mean(double *x, double *y, int nr, double *xmean, double *xsd, double *ymean, double *ysd)
Definition pearson.c:341