Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Представить заданные вещественные числа А и В в формате с плавающей точкой.

Валерия Заикина Ученик (187), закрыт 5 лет назад
Представить заданные вещественные числа А и В в формате с плавающей точкой. Выполнить сложение этих чисел в различных числовых форматах: а) как числа половинной точности, б) как числа двойной точности (см. описание типов). Все стадии решения представить в двоичной системе счисления (или в 16-ой для компактности записи). Оценить погрешность вычисления, взяв за основу истинный результат вычисления. В случае появления ошибки вычисления, аргументировать причины такой ошибки.
А = -637,09, В = -29,4.
Лучший ответ
Соколов Максим Мастер (1762) 5 лет назад
Тут, наверное, красивым столбиком не получится, вы в блокнот с моноширинным шрифтом вставьте текст.

A = -637.09, B = -29.4, C = A+B

[половинная точность]
A = E0FA (1 11000 0011111010) = -637
B = CF59 (1 10011 1101011001) = -29.375
C = E134 (1 11000 0100110100) = -666

[float - одинарная точность]
A = C41F45C3 (1 10001000 00111110100010111000011) = -637.0900268554687
B = C1EB3333 (1 10000011 11010110011001100110011) = -29.399999618530273
C = C4269F5D (1 10001000 01001101001111101011101) = -666.4900512695312

[double - двойная точность]
A = C083E8B851EB851F (1 10000001000 0011111010001011100001010001111010111000010100011111)
B = C03D666666666666 (1 10000000011 1101011001100110011001100110011001100110011001100110)
C = C084D3EB851EB852 (1 10000001000 0100110100111110101110000101000111101011100001010010)

[истинный]
C = -666.49
Соколов МаксимМастер (1762) 5 лет назад
Нашёл так же сайт, где можно представлять числа с плавающей запятой с любой мантиссой/экспонентой (вплоть до одинарной точности float) и выполнять с ними вещественные операции. Библиотека mediump-float.js реализована на чистом JS стандарта ECMAScript 6, код грамотно документирован. Ссылка:
https://oletus.github.io/float16-simulator.js/
Соколов МаксимМастер (1762) 4 года назад
Если вычислять более точно, значения переменных (A, B и C) будут иметь следующие значения.
Для float:
-637.09002685546875,
-29.3999996185302734375,
-666.49005126953125.
Для double:
-637.0900000000000318323145620524883270263671875,
-29.39999999999999857891452847979962825775146484375,
-666.490000000000009094947017729282379150390625.
Остальные ответы
фёдорович Профи (978) 5 лет назад
сложить пару чисел двойной точности:

#include < stdio.h >
int main() {
double A = -637.09;
double B = -29.4;
printf("A+B = %f", A+B);
}

вывести число в двоичном представлении:

#include < stdio.h >
#include < stdint.h >
int main() {
char str[65];
int i;
double A = -637.09;

// представить память по адресу нашей переменной А, как 64-битное целое число без знака
uint64_t* pA = (uint64_t*)&A;

// перебрать все 64 бита, повторить 64 раза
for (i = 0; i < 64; ++i) {

// тут берём младший бит числа А, это число 0 или 1, складываем его с номером символа "ноль", и дописываем полученный символ в строку задом наперёд
str[64 - i - 1] = '0' + (*pA & 1);

// сдвигаем вправо на 1 бит, теперь младший бит - теряется, а второй по старшинству бит становится младшим
*pA >>= 1;
}

// не забываем терминатор строки `\0`;
str[64] = 0;

// теперь можно вывести строку, содержит 64 символа в соотв с битами числа
printf("binary representation: %s", str);

return 0;
}

Дальше сам поиграйся, или за деньги ;-)
Соколов МаксимМастер (1762) 5 лет назад
Код писать вроде не просили – вряд ли захотят платить деньги за «не то» ;-)
Попробуйте использовать printf("%08x", (int32_t)value);
А в двоичный вид привести из шестнадцатеричного в уме легко.
Похожие вопросы