все, что я пытаюсь реализовать арифметическую библиотеку с плавающей запятой, и мне трудно понять алгоритм вычитания с плавающей запятой. Я успешно реализовал сложение и думал, что вычитание — это всего лишь его частный случай, но, похоже, я где-то ошибся. Я добавляю код сюда только для справки, он имеет много понятных функций, но я не ожидаю, что кто-то поймет его на 100%. В чем я хотел бы помочь, так это в алгоритме. Мы следуем тому же методу, что и при добавлении чисел с плавающей запятой, за исключением того, что когда мы добавляем мантиссы, мы преобразуем отрицательную единицу (тот, которую мы вычитаем) в дополнение до двух, а затем добавляем их?
Это то, что я делаю, но результат не правильный. Пусть и очень близко... но не то же самое. У кого-нибудь есть идеи? Заранее спасибо!
Я совершенно уверен, что то, как я это делаю, работает, поскольку я реализовал почти идентичный алгоритм добавления поплавков, и он работает как шарм.
_float subFloat(_float f1,_float f2)
{
unsigned char diff;
_float result;
//first see whose exponent is greater
if(f1.float_parts.exponent > f2.float_parts.exponent)
{
diff = f1.float_parts.exponent - f2.float_parts.exponent;
//now shift f2's mantissa by the difference of their exponent to the right
//adding the hidden bit
f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22);
f2.float_parts.mantissa >>= (int)(diff);//was (diff-1)
//also increase its exponent by the difference shifted
f2.float_parts.exponent = f2.float_parts.exponent + diff;
}
else if(f1.float_parts.exponent < f2.float_parts.exponent)
{
diff = f2.float_parts.exponent - f1.float_parts.exponent;
result = f1;
f1 = f2; //swap them
f2 = result;
//now shift f2's mantissa by the difference of their exponent to the right
//adding the hidden bit
f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22);
f2.float_parts.mantissa >>= (int)(diff);
//also increase its exponent by the difference shifted
f2.float_parts.exponent = f2.float_parts.exponent + diff;
}
else//if the exponents were equal
f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22); //bring out the hidden bit
//getting two's complement of f2 mantissa
f2.float_parts.mantissa ^= 0x7FFFFF;
f2.float_parts.mantissa += 0x01;
result.float_parts.exponent = f1.float_parts.exponent;
result.float_parts.mantissa = (f1.float_parts.mantissa +f2.float_parts.mantissa)>>1;
//gotta shift right by overflow bits
//normalization
if(manBitSet(result,1))
result.float_parts.mantissa <<= 1; //hide the hidden bit
else
result.float_parts.exponent +=1;
return result;
}