Моя цель — создать функцию, которая складывает два числа с плавающей запятой БЕЗ использования инструкций с плавающей запятой.
Мне также нужно использовать as насколько это возможно, низкоуровневые операции, потому что мне нужно перевести их на ассемблер.
Таким образом, я могу получить правильные результаты для таких значений, как 1,5 + 2,5, 1,5 + -1,5, и 13,6 + 52.1.
Однако, когда я ввожу что-то вроде 1 000 000 + 0,0001, я получаю 1,4295e+06.
Если я добавляю 1 000 000 с 0, я правильно получаю 1e+06.
Итак Я предполагаю, что проблема связана с неточностью значений с плавающей запятой.
Соответствующий код:
Код: Выделить всё
#include
union FloatBits {
float f;
uint32_t bits;
};
float add_floats(float a, float b) {
FloatBits a_bits, b_bits;
a_bits.f = a; // Initialize the 32 bit value
b_bits.f = b;
uint32_t a_sign = a_bits.bits & 0x80000000; // Sign
a_sign = a_sign >> 31;
uint32_t a_exponent = a_bits.bits & 0x7f800000; // Exponent
a_exponent = a_exponent >> 23;
uint32_t a_mantissa = a_bits.bits & 0x7fffff; // Mantissa
uint32_t b_sign = b_bits.bits & 0x80000000; // Sign
b_sign = b_sign >> 31;
uint32_t b_exponent = b_bits.bits & 0x7f800000; // Exponent
b_exponent = b_exponent >> 23;
uint32_t b_mantissa = b_bits.bits & 0x7fffff; // Mantissa
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79245721/how-can-i-use-low-level-operations-to-add-floating-points-numbers-together[/url]