/uspace/trunk/softfloat/include/sftypes.h |
---|
32,6 → 32,8 |
typedef union { |
float f; |
__u32 binary; |
struct { |
#ifdef __BIG_ENDIAN__ |
__u32 sign:1; |
49,6 → 51,8 |
typedef union { |
double d; |
__u64 binary; |
struct { |
#ifdef __BIG_ENDIAN__ |
__u64 sign:1; |
/uspace/trunk/softfloat/generic/softfloat.c |
---|
83,5 → 83,58 |
/* Comparison functions */ |
/* a<b .. -1 |
* a=b .. 0 |
* a>b .. 1 |
* */ |
int __cmpsf2(double a, double b) |
{ |
float32 fa,fb; |
fa.f=a; |
fb.f=b; |
if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) { |
return 1; /* no special constant for unordered - maybe signaled? */ |
}; |
if (isFloat32eq(fa,fb)) { |
return 0; |
}; |
if (isFloat32lt(fa,fb)) { |
return -1; |
}; |
return 1; |
} |
int __unordsf2(float a, float b) |
{ |
float32 fa,fb; |
fa.f=a; |
fb.f=b; |
return ((isFloat32NaN(fa))||(isFloat32NaN(fb))); |
}; |
/** |
* @return zero, if neither argument is a NaN and are equal |
* */ |
int __eqsf2(float a, float b) |
{ |
float32 fa,fb; |
fa.f=a; |
fb.f=b; |
if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
return isFloat32eq(fa,fb)-1; |
}; |
/* strange behavior, but it was in gcc documentation */ |
int __nesf2(float a, float b) |
{ |
return __eqsf2(a,b); |
}; |
/* Other functions */ |
/uspace/trunk/softfloat/generic/comparison.c |
---|
39,3 → 39,31 |
return ((f.parts.exp==0xFF)&&(f.parts.mantisa>0x400000)); |
}; |
inline int isFloat32Infinity(float32 f) |
{ |
return ((f.parts.exp==0xFF)&&(f.parts.mantisa==0x0)); |
}; |
/** |
* @return 1, if both floats are equal - but NaNs are not recognized |
*/ |
inline int isFloat32eq(float32 a, float32 b) |
{ |
return ((a==b)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */ |
} |
/** |
* @return 1, if a>b - but NaNs are not recognized |
*/ |
inline int isFloat32lt(float32 a, float32 b) |
{ |
if (((a.binary| b.binary)&0x7FFFFFFF)==0) { |
return 0; |
}; |
a.parts.sign^=a.parts.sign; |
b.parts.sign^=b.parts.sign; |
return (a.binary<b.binary); |
} |