Представить заданные вещественные числа А и В в формате с плавающей точкой. Выполнить сложение этих чисел в различных числовых форматах: а) как числа половинной точности, б) как числа двойной точности (см. описание типов). Все стадии решения представить в двоичной системе счисления (или в 16-ой для компактности записи). Оценить погрешность вычисления, взяв за основу истинный результат вычисления. В случае появления ошибки вычисления, аргументировать причины такой ошибки.
А = -637,09, В = -29,4.
Другие языки программирования и технологии
Представить заданные вещественные числа А и В в формате с плавающей точкой.
Тут, наверное, красивым столбиком не получится, вы в блокнот с моноширинным шрифтом вставьте текст.
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
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
3
сложить пару чисел двойной точности:
#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;
}
Дальше сам поиграйся, или за деньги ;-)
#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;
}
Дальше сам поиграйся, или за деньги ;-)
Sardor Saipov
Код писать вроде не просили – вряд ли захотят платить деньги за «не то» ;-)
Попробуйте использовать printf("%08x", (int32_t)value);
А в двоичный вид привести из шестнадцатеричного в уме легко.
Попробуйте использовать printf("%08x", (int32_t)value);
А в двоичный вид привести из шестнадцатеричного в уме легко.
Похожие вопросы
- Представить вещественные числа в четырёхбайтовой ячейке памяти в формате с плавающей точкой.
- Как написать программу, которая будет представлять вещественное число в памяти компьютера
- Assembler - Числа с плавающей точкой
- Почему вещественные числа в компьютере представлены не точно?
- Как срандомить случайные вещественные числа N и занести их в массив? C++
- Вещественные числа и языки программирования
- Pascal . Дан массив вещественных чисел. Найти сумму элементов, номера которых являются простыми числами
- Какова природа вещественных чисел в Си?
- Чем отличается целое и длинное целое число от двойного с плавающей точкой? и сколько в каждом из них цифр
- Дано вещественное число R и массив размера N. Найти элемент массива, который наименее близок к данному числу
https://oletus.github.io/float16-simulator.js/
Для float:
-637.09002685546875,
-29.3999996185302734375,
-666.49005126953125.
Для double:
-637.0900000000000318323145620524883270263671875,
-29.39999999999999857891452847979962825775146484375,
-666.490000000000009094947017729282379150390625.