⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 math24f.h

📁 FreeRTOS 是一个源码公开的免费的嵌入式实时操作系统
💻 H
📖 第 1 页 / 共 2 页
字号:

    while (1)  {
        W = 8;
        expo -= W;
        if (!Carry)
            break;
        xtra = arg2f24.low8;
        arg2f24.low8 = arg2f24.mid8;
        arg2f24.mid8 = 0;
    }
    expo += W;
    if (expo)  {
        do  {
            Carry = 0;
            arg2f24.low16 = rr( arg2f24.low16);
            xtra = rr( xtra);
        } while (--expo > 0);
    }


    if (sign & 0x80)  {
        // SUBTRACT
        arg1f24.low8 -= arg2f24.low8;
        genSub( arg1f24.mid8, arg2f24.mid8);
        if (!Carry)  {  // arg2f24 > arg1f24
            arg1f24.low16 = -arg1f24.low16;
            // xtra == 0 because arg1f24.exp == arg2f24.exp
            temp ^= 0x80;  // invert sign
        }
        xtra = -xtra;
        if (xtra)
            arg1f24.low16 --;
        // adjust result left
       #define counter expo
        counter = 3;
        while (!arg1f24.mid8)  {
            arg1f24.mid8 = arg1f24.low8;
            arg1f24.low8 = xtra;
            xtra = 0;
            arg1f24.high8 -= 8;
            if (!Carry)
                goto RES0;
            if (--counter == 0)  // max 2 iterations
                goto RES0;
        }
       #undef counter
        while (!arg1f24.15)  {
            Carry = 0;
            xtra = rl( xtra);
            arg1f24.low16 = rl( arg1f24.low16);
            arg1f24.high8 --;
            if (!arg1f24.high8)
                goto RES0;   // UNDERFLOW?
        }
       #ifndef DISABLE_ROUNDING
        if (FpRounding  &&  (xtra & 0x80))  {
            xtra = 0; // disable recursion
            goto INCREMENT;
        }
       #endif
    }
    else  {
        // ADD arg1f24 and arg2f24
        arg1f24.low8 += arg2f24.low8;
        genAdd( arg1f24.mid8, arg2f24.mid8);
        if (Carry)  {
          ADJUST_RIGHT:
            arg1f24.low16 = rr( arg1f24.low16);
            xtra = rr( xtra);
            arg1f24.high8 += 1;  // exp
            if (!arg1f24.high8)
                goto OVERFLOW;
        }
       #ifndef DISABLE_ROUNDING
        if (FpRounding  &&  (xtra & 0x80))  {
          INCREMENT:
            arg1f24.low8 += 1;
            if (!arg1f24.low8)  {
                arg1f24.mid8 += 1;
                if (!arg1f24.mid8)  {
                    Carry = 1; // prepare for shift
                    arg1f24.0 = 0;  // disable recursion
                    goto ADJUST_RIGHT;
                }
            }
        }
       #endif
    }
    goto SET_SIGN;

//  UNDERFLOW:
//    FpUnderFlow = 1;
  RES0:
    arg1f24.high8 = 0;
    goto MANTISSA;

  OVERFLOW:
    FpOverflow = 1;
    arg1f24.high8 = 0xFF;
  MANTISSA:
    arg1f24.low16 = 0x8000;

  SET_SIGN:
    if (!(temp & 0x80))
        arg1f24.15 = 0;

  RETURN:
    return arg1f24;
}


// SUBTRACTION

float24 operator- _fsub24( sharedM float24 arg1f24, sharedM float24 arg2f24)
{
    arg2f24.mid8 ^= 0x80;
    arg1f24 += arg2f24;
    return arg1f24;
}


float24 operator=( int8 arg) @
float24 operator=( uns8 arg) @
float24 operator=( int16 arg) @
float24 operator=( uns16 arg) @
float24 operator= _int24ToFloat24( sharedM int24 arg1f24)
{
    sharedM float24 arg2f24;   // unused, but required
    char expo = FpBIAS + 16 - 1;
    char xtra = 0;
    char sign = 0;
    if (arg1f24 < 0)  {
        arg1f24 = -arg1f24;
        sign |= 0x80;
    }
    if (arg1f24.high8)  {
        expo += 8;
        xtra = arg1f24.low8;
        arg1f24.low8 = arg1f24.mid8;
        arg1f24.mid8 = arg1f24.high8;
    }
    else if (!arg1f24.mid8)  {
        expo -= 8;
        W = arg1f24.low8;
        if (!W)
            goto RETURN;
        arg1f24.mid8 = W;
        arg1f24.low8 = 0;
    }

    // arg1f24.mid8 != 0
    goto TEST_ARG1_B15;
    do  {
        xtra = rl( xtra);
        arg1f24.low16 = rl( arg1f24.low16);
        expo --;
      TEST_ARG1_B15:
    } while (!arg1f24.15);

   #ifndef DISABLE_ROUNDING
    if (FpRounding && (xtra & 0x80))  {
        arg1f24.low8 += 1;
        if (!arg1f24.low8)  {
            arg1f24.mid8 += 1;
            if (!arg1f24.mid8)  {
                Carry = 1;
                arg1f24.low16 = rr( arg1f24.low16);
                expo ++;
            }
        }
    }
   #endif

    arg1f24.high8 = expo;
    if (!(sign & 0x80))
        arg1f24.15 = 0;

  RETURN:
    float24 rval @ arg1f24;
    rval.low24 = arg1f24.low24;
    return rval;
}


float24 operator=( uns24 arg) @
float24 operator= _int32ToFloat24( int32 arg32)
{
    char expo = FpBIAS + 16 - 1;
    char xtra @ arg32.high8;
    char sign = 0;
    if (arg32 < 0)  {
        arg32 = -arg32;
        sign |= 0x80;
    }
    if (arg32.high8)  {
        expo += 8;
        arg32.low8 = arg32.midL8;
        arg32.midL8 = arg32.midH8;
        arg32.midH8 = arg32.high8;
        arg32.high8 = 0;
    }
    if (arg32.midH8)  {
        expo += 8;
        xtra = arg32.low8;
        arg32.low8 = arg32.midL8;
        arg32.midL8 = arg32.midH8;
    }
    else if (!arg32.midL8)  {
        expo -= 8;
        W = arg32.low8;
        if (!W)
            goto RETURN;
        arg32.midL8 = W;
        arg32.low8 = 0;
    }

    // arg32.midL8 != 0
    goto TEST_ARG_B15;
    do  {
        xtra = rl( xtra);
        arg32.low16 = rl( arg32.low16);
        expo --;
      TEST_ARG_B15:
    } while (!arg32.15);

   #ifndef DISABLE_ROUNDING
    if (FpRounding && (xtra & 0x80))  {
        arg32.low8 += 1;
        if (!arg32.low8)  {
            arg32.midL8 += 1;
            if (!arg32.midL8)  {
                Carry = 1;
                arg32.low16 = rr( arg32.low16);
                expo ++;
            }
        }
    }
   #endif

    arg32.midH8 = expo;
    if (!(sign & 0x80))
        arg32.15 = 0;

  RETURN:
    float24 rval @ arg32;
    rval.low24 = arg32.low24;
    return rval;
}


uns8 operator=( sharedM float24 arg1f24) @
int8 operator=( sharedM float24 arg1f24) @
uns16 operator=( sharedM float24 arg1f24) @
int16 operator=( sharedM float24 arg1f24) @
int24 operator= _float24ToInt24( sharedM float24 arg1f24)
{
    sharedM float24 arg2f24;   // unused, but required
    char sign = arg1f24.mid8;
    char expo = arg1f24.high8 - (FpBIAS-1);
    if (!Carry)
        goto RES0;
    arg1f24.15 = 1;

    arg1f24.high8 = 0;
   #ifndef DISABLE_ROUNDING
    char xtra = 0;
   #endif

    // (a): expo = 0..8 : shift 1 byte to the right
    // (b): expo = 9..16: shift 0 byte
    // (c): expo = 17..24: shift 1 byte to the left
   #if __CoreSet__ / 100 == 12
    expo -= 17;
    expo = 0xFF - expo;  // COMF (Carry unchanged)
    if (Carry)  {  // (c)
   #else
    expo = 16 - expo;
    if (!Carry)  {  // (c)
   #endif
        expo += 8;
        if (!Carry)
            goto OVERFLOW;
        arg1f24.high8 = arg1f24.mid8;
        arg1f24.mid8 = arg1f24.low8;
        arg1f24.low8 = 0;
    }
    else  {  // (a) (b)
        // expo = 0 .. 16
        W = expo - 8;
        if (Carry)  {  // (a)
            expo = W;
           #ifndef DISABLE_ROUNDING
            xtra = arg1f24.low8;
           #endif
            arg1f24.low8 = arg1f24.mid8;
            arg1f24.mid8 = 0;
        }
    }
    if (expo)  {
        do  {
            Carry = 0;
            arg1f24.high8 = rr( arg1f24.high8);
            arg1f24.low16 = rr( arg1f24.low16);
           #ifndef DISABLE_ROUNDING
            xtra = rr( xtra);
           #endif
        } while (--expo);
    }
    if (arg1f24.23)  {
       OVERFLOW:
        FpOverflow = 1;
        W = 0xFF;
        goto ASSIGNW;
       RES0:
        W = 0;
       ASSIGNW:
        arg1f24.low8 = W;
        arg1f24.mid8 = W;
        arg1f24.high8 = W;
        arg1f24.23 = 0;
    }
    else  {
       #ifndef DISABLE_ROUNDING
        if (FpRounding && (xtra & 0x80))  {
            arg1f24.low8 += 1;
            if (!arg1f24.low8)
                arg1f24.mid8 += 1;
        }
       #endif
        if (sign & 0x80)
            arg1f24.low24 = -arg1f24.low24;
    }
    int24 rval @ arg1f24;
    rval = arg1f24.low24;
    return rval;
}


bit operator< _f24_LT_f24( sharedM float24 arg1f24, sharedM float24 arg2f24)
{
    Carry = 0;
    if (!(arg1f24.high8 | arg2f24.high8))
        return Carry;
    if (!arg1f24.15)  {
        if (arg2f24.15)
            return Carry;
        W = arg1f24.low8 - arg2f24.low8;
        genSubW( arg1f24.mid8, arg2f24.mid8);
        genSubW( arg1f24.high8, arg2f24.high8);
        goto RETURN;
    }
    if (!arg2f24.15)
        goto RETURN;
    W = arg2f24.low8 - arg1f24.low8;
    genSubW( arg2f24.mid8, arg1f24.mid8);
    genSubW( arg2f24.high8, arg1f24.high8);
  RETURN:
    if (Carry)
        return 0;
    return 1;
}


bit operator>= _f24_GE_f24( sharedM float24 arg1f24, sharedM float24 arg2f24)
{
    Carry = 1;
    if (!(arg1f24.high8 | arg2f24.high8))
        return Carry;
    if (!arg1f24.15)  {
        if (arg2f24.15)
            return Carry;
        W = arg1f24.low8 - arg2f24.low8;
        genSubW( arg1f24.mid8, arg2f24.mid8);
        genSubW( arg1f24.high8, arg2f24.high8);
        return Carry;
    }
    Carry = 0;
    if (!arg2f24.15)
        return Carry;
    W = arg2f24.low8 - arg1f24.low8;
    genSubW( arg2f24.mid8, arg1f24.mid8);
    genSubW( arg2f24.high8, arg1f24.high8);
    return Carry;
}



bit operator> _f24_GT_f24( sharedM float24 arg1f24, sharedM float24 arg2f24)
{
    Carry = 0;
    if (!(arg1f24.high8 | arg2f24.high8))
        return Carry;
    if (!arg1f24.15)  {
        if (arg2f24.15)
            goto RETURN;
        W = arg2f24.low8 - arg1f24.low8;
        genSubW( arg2f24.mid8, arg1f24.mid8);
        genSubW( arg2f24.high8, arg1f24.high8);
        goto RETURN;
    }
    if (!arg2f24.15)
        return Carry;
    W = arg1f24.low8 - arg2f24.low8;
    genSubW( arg1f24.mid8, arg2f24.mid8);
    genSubW( arg1f24.high8, arg2f24.high8);
  RETURN:
    if (Carry)
        return 0;
    return 1;
}



bit operator<= _f24_LE_f24( sharedM float24 arg1f24, sharedM float24 arg2f24)
{
    Carry = 1;
    if (!(arg1f24.high8 | arg2f24.high8))
        return Carry;
    if (!arg1f24.15)  {
        Carry = 0;
        if (arg2f24.15)
            return Carry;
        W = arg2f24.low8 - arg1f24.low8;
        genSubW( arg2f24.mid8, arg1f24.mid8);
        genSubW( arg2f24.high8, arg1f24.high8);
        return Carry;
    }
    if (!arg2f24.15)
        return Carry;
    W = arg1f24.low8 - arg2f24.low8;
    genSubW( arg1f24.mid8, arg2f24.mid8);
    genSubW( arg1f24.high8, arg2f24.high8);
    return Carry;
}


#undef genAdd
#undef genSub
#undef genAddW
#undef genSubW

#pragma library 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -