Как я могу использовать низкоуровневые операции для сложения чисел с плавающей запятой?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу использовать низкоуровневые операции для сложения чисел с плавающей запятой?

Сообщение Anonymous »

Я столкнулся с проблемой в своем коде на C++.
Моя цель — создать функцию, которая складывает два числа с плавающей запятой БЕЗ использования инструкций с плавающей запятой.
Мне также нужно использовать 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»