Update float_twice

This commit is contained in:
cyp0633 2022-03-24 20:59:09 +08:00
parent 8360bdc1fe
commit e55a744aab
Signed by: cyp0633
GPG Key ID: E1BC508A994A5138
2 changed files with 10 additions and 45 deletions

View File

@ -368,63 +368,28 @@ unsigned float_i2f(int x)
* Max ops: 30
* Rating: 4
*/
// unsigned float_twice(unsigned uf)
// {
// // INF and NaN judge
// int expMask, exp, sign, signMask, frac, fracMask, uf_nosign;
// expMask = 0x7f800000; // get exponent bits
// exp = (uf & expMask);
// if (exp == expMask)
// {
// return uf;
// }
// // Special numbers
// signMask = 0x80000000; // get sign bit
// sign = (uf & signMask) >> 31;
// fracMask = 0x007fffff; // get fraction bits
// frac = uf & fracMask;
// if (sign == 0 && frac == 0) // Zero, just return 0
// {
// return 0;
// }
// // Denormalizd numbers
// uf_nosign = uf & 0x7fffffff; // remove sign bit
// if ((uf_nosign >> 23) == 0)
// {
// uf_nosign = uf_nosign << 1 | sign;
// return uf_nosign;
// }
// // Normalized numbers
// if (uf_nosign >> 23 == 0xff) //
// {
// return uf;
// }
// if ((exp >> 23) + 1 == 0xff)
// {
// return sign | 0x7f800000;
// }
// return sign | ((exp >> 23) + 1) << 23 | frac << 1;
// }
unsigned float_twice(unsigned uf)
{
int uf_nosign;
int sign = uf & 0x80000000; // sign bit
int exp = uf & 0x7f800000; // exponent bits
int fraction = uf & 0x7fffff; // fraction bits
uf_nosign = uf & 0x7fffffff; // remove sign
if ((uf_nosign >> 23) == 0x0)
int sign = uf & 0x80000000; // sign bit
int exp = uf & 0x7f800000; // exponent bits
int fraction = uf & 0x7fffff; // fraction bits
uf_nosign = uf & 0x7fffffff; // remove sign
if ((uf_nosign >> 23) == 0x0) // denormalized condition
{
uf_nosign = uf_nosign << 1 | sign;
return uf_nosign;
}
if ((uf_nosign >> 23) == 0xff)
if ((uf_nosign >> 23) == 0xff) // special numbers (NaN and infty)
{
return uf;
}
if ((exp >> 23) + 1 == 0xff)
// if ((exp >> 23) + 1 == 0xff) // exponent overflow
if (exp == 0x7f000000) // exponent overflow
{
return sign | 0x7f800000;
}
return sign | (((exp >> 23) + 1) << 23) | fraction;
// return sign | (((exp >> 23) + 1) << 23) | fraction;
return sign | (exp + 0x800000) | fraction;
}

Binary file not shown.