1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/* copyright Enpc: Jean-Philippe Chancelier */
#include "../stack-c.h"
#include "../os_specific/Os_specific.h" /* isanan */
#ifdef WIN32
/* vc++ pbs with nan and comparisons */
#define NAN_CHECK
#endif
#define less 59
#define great 60
#define equal 50
/* less + equal */
#define less_equal 109
/* less + great */
#define less_great 119
/* great + equal */
#define great_equal 110
static void idcmp_equal(double x[],double y[],int *n,int res[]) ;
static void idcmp_lessgreat(double x[],double y[],int *n,int res[]) ;
static void idcmp_less(double x[],double y[],int *n,int res[]) ;
static void idcmp_great(double x[],double y[],int *n,int res[]) ;
static void idcmp_lessequal(double x[],double y[],int *n,int res[]) ;
static void idcmp_greatequal(double x[],double y[],int *n,int res[]) ;
int C2F(idcmp)(double x[],double y[],int *n,int res[],int *op)
{
int i;
switch (*op) {
case equal : idcmp_equal(x,y,n,res) ; break;
case less_great : idcmp_lessgreat(x,y,n,res) ; break;
case less : idcmp_less(x,y,n,res) ; break;
case great : idcmp_great(x,y,n,res) ; break;
case less_equal : idcmp_lessequal(x,y,n,res) ; break;
case great_equal : idcmp_greatequal(x,y,n,res) ; break;
default:
for (i=0; i < *n; i++) res[i]=0;
}
return 0;
}
/* nan pbs with vc++ */
static void idcmp_equal(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 0;
else
res[i]= x[i]== y[i];
#else
res[i]= x[i]== y[i];
#endif
}
}
static void idcmp_lessgreat(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 1;
else
res[i]= x[i] != y[i];
#else
res[i]= x[i] != y[i];
#endif
}
}
static void idcmp_less(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 0;
else
res[i]= x[i] < y[i];
#else
res[i]= x[i] < y[i];
#endif
}
}
static void idcmp_great(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 0;
else
res[i]= x[i] > y[i];
#else
res[i]= x[i] > y[i];
#endif
}
}
static void idcmp_lessequal(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 0;
else
res[i]= x[i] <= y[i];
#else
res[i]= x[i] <= y[i];
#endif
}
}
static void idcmp_greatequal(double x[],double y[],int *n,int res[])
{
int i;
for (i=0; i < *n; i++)
{
#ifdef NAN_CHECK
if ( C2F(isanan)(&x[i])== 1 || C2F(isanan)(&y[i])== 1 )
res[i]= 0;
else
res[i]= x[i] >= y[i];
#else
res[i]= x[i] >= y[i];
#endif
}
}
|