📄 math24f.h
字号:
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 + -