Соколов Максим
Мастер
(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);
А в двоичный вид привести из шестнадцатеричного в уме легко.
А = -637,09, В = -29,4.