Changes in uspace/lib/softfloat/generic/comparison.c [750636a:00acd66] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/softfloat/generic/comparison.c
r750636a r00acd66 27 27 */ 28 28 29 /** @addtogroup softfloat 29 /** @addtogroup softfloat 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #include 36 #include 35 #include<sftypes.h> 36 #include<comparison.h> 37 37 38 /* NaN : exp = 0xff and nonzero fraction */ 39 int isFloat32NaN(float32 f) 40 { 41 return ((f.parts.exp == 0xFF) && (f.parts.fraction)); 38 inline int isFloat32NaN(float32 f) 39 { /* NaN : exp = 0xff and nonzero fraction */ 40 return ((f.parts.exp==0xFF)&&(f.parts.fraction)); 42 41 } 43 42 44 /* NaN : exp = 0x7ff and nonzero fraction */ 45 int isFloat64NaN(float64 d) 46 { 47 return ((d.parts.exp == 0x7FF) && (d.parts.fraction)); 43 inline int isFloat64NaN(float64 d) 44 { /* NaN : exp = 0x7ff and nonzero fraction */ 45 return ((d.parts.exp==0x7FF)&&(d.parts.fraction)); 48 46 } 49 47 50 /* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ 51 int isFloat32SigNaN(float32 f) 52 { 53 return ((f.parts.exp == 0xFF) && (f.parts.fraction < 0x400000) && (f.parts.fraction)); 48 inline int isFloat32SigNaN(float32 f) 49 { /* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ 50 return ((f.parts.exp==0xFF)&&(f.parts.fraction<0x400000)&&(f.parts.fraction)); 54 51 } 55 52 56 /* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ 57 int isFloat64SigNaN(float64 d) 58 { 59 return ((d.parts.exp == 0x7FF) && (d.parts.fraction) && (d.parts.fraction < 0x8000000000000ll)); 53 inline int isFloat64SigNaN(float64 d) 54 { /* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ 55 return ((d.parts.exp==0x7FF)&&(d.parts.fraction)&&(d.parts.fraction<0x8000000000000ll)); 60 56 } 61 57 62 in t isFloat32Infinity(float32 f)58 inline int isFloat32Infinity(float32 f) 63 59 { 64 return ((f.parts.exp == 0xFF) && (f.parts.fraction ==0x0));60 return ((f.parts.exp==0xFF)&&(f.parts.fraction==0x0)); 65 61 } 66 62 67 in t isFloat64Infinity(float64 d)63 inline int isFloat64Infinity(float64 d) 68 64 { 69 return ((d.parts.exp == 0x7FF) && (d.parts.fraction ==0x0));65 return ((d.parts.exp==0x7FF)&&(d.parts.fraction==0x0)); 70 66 } 71 67 72 in t isFloat32Zero(float32 f)68 inline int isFloat32Zero(float32 f) 73 69 { 74 70 return (((f.binary) & 0x7FFFFFFF) == 0); 75 71 } 76 72 77 in t isFloat64Zero(float64 d)73 inline int isFloat64Zero(float64 d) 78 74 { 79 75 return (((d.binary) & 0x7FFFFFFFFFFFFFFFll) == 0); … … 81 77 82 78 /** 83 * @return 1 if both floats are equal - but NaNs are not recognized79 * @return 1, if both floats are equal - but NaNs are not recognized 84 80 */ 85 in t isFloat32eq(float32 a, float32 b)81 inline int isFloat32eq(float32 a, float32 b) 86 82 { 87 /* a equals to b or both are zeros (with any sign) */ 88 return ((a.binary==b.binary) || (((a.binary | b.binary) & 0x7FFFFFFF) == 0)); 83 return ((a.binary==b.binary)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */ 89 84 } 90 85 91 86 /** 92 * @return 1 if a <b - but NaNs are not recognized87 * @return 1, if a<b - but NaNs are not recognized 93 88 */ 94 in t isFloat32lt(float32 a, float32 b)89 inline int isFloat32lt(float32 a, float32 b) 95 90 { 96 if (((a.binary | b.binary) & 0x7FFFFFFF) == 0)91 if (((a.binary| b.binary)&0x7FFFFFFF)==0) { 97 92 return 0; /* +- zeroes */ 93 }; 98 94 99 if ((a.parts.sign) && (b.parts.sign)) 100 /* if both are negative, smaller is that with greater binary value */ 101 return (a.binary > b.binary); 95 if ((a.parts.sign)&&(b.parts.sign)) { 96 /*if both are negative, smaller is that with greater binary value*/ 97 return (a.binary>b.binary); 98 }; 102 99 103 /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison) */ 104 a.parts.sign = !a.parts.sign; 105 b.parts.sign = !b.parts.sign; 106 return (a.binary < b.binary); 100 /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ 101 a.parts.sign=!a.parts.sign; 102 b.parts.sign=!b.parts.sign; 103 return (a.binary<b.binary); 104 107 105 } 108 106 109 107 /** 110 * @return 1 if a >b - but NaNs are not recognized108 * @return 1, if a>b - but NaNs are not recognized 111 109 */ 112 in t isFloat32gt(float32 a, float32 b)110 inline int isFloat32gt(float32 a, float32 b) 113 111 { 114 if (((a.binary | b.binary) & 0x7FFFFFFF) == 0)112 if (((a.binary| b.binary)&0x7FFFFFFF)==0) { 115 113 return 0; /* zeroes are equal with any sign */ 114 }; 116 115 117 if ((a.parts.sign) && (b.parts.sign)) 118 /* if both are negative, greater is that with smaller binary value */ 119 return (a.binary < b.binary); 116 if ((a.parts.sign)&&(b.parts.sign)) { 117 /*if both are negative, greater is that with smaller binary value*/ 118 return (a.binary<b.binary); 119 }; 120 120 121 /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison) */ 122 a.parts.sign = !a.parts.sign; 123 b.parts.sign = !b.parts.sign; 124 return (a.binary > b.binary); 121 /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ 122 a.parts.sign=!a.parts.sign; 123 b.parts.sign=!b.parts.sign; 124 return (a.binary>b.binary); 125 125 126 } 126 127
Note:
See TracChangeset
for help on using the changeset viewer.