From f48c913a105a42f7b09a2ed9c4acb517dd9633fa Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 14 Dec 2025 16:19:16 +0300 Subject: [PATCH 1/2] Implemented the output of a double number in exponential form --- InternalRepresentation/double.c | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 InternalRepresentation/double.c diff --git a/InternalRepresentation/double.c b/InternalRepresentation/double.c new file mode 100644 index 0000000..83d6e02 --- /dev/null +++ b/InternalRepresentation/double.c @@ -0,0 +1,42 @@ +/* + В C для типа double используется стандарт IEEE 754 + IEEE 754 - стандарт размещения вещественных чисел в памяти + + В соответствии с этим стандартом + 63 бит выделяется под знак (1 - минус, 0 - плюс) + С 52 по 62 биты выделяются под экспоненту + С 0 по 51 биты выделяются под мантиссу +*/ + +#include + +typedef union { + // Размер типа double - 8 байт или 64 бита + double value; + // Размер типа unsigned long long - не меннее 8 байт или 64 бит + unsigned long long bits; +} DoubleUnion; + +int main(void) { + DoubleUnion doubleUnion; + printf("Enter a number: "); + if (scanf("%lf", &doubleUnion.value) != 1) { + return 1; + } + + unsigned long long bits = doubleUnion.bits; + + // Берем 63 бит + char sign = (bits >> 63) ? '-' : '+'; + // Берем с 62 по 52 биты + unsigned long long exponent = (bits >> 52) & 0x7FFUL; + // Берем последние 52 бита + unsigned long long mantissa = bits & 0xFFFFFFFFFFFFFUL; + + double mantissa_value = 1.0 + (double) mantissa / (1ULL << 52); + int real_exponent = (int) exponent - 1023; + + printf("Result: %c%.20g*2^%d\n", sign, mantissa_value, real_exponent); + + return 0; +} From 0b4b902145e10fece47f48a0f2ab749e6687206e Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 14 Dec 2025 16:20:44 +0300 Subject: [PATCH 2/2] Formatted file --- InternalRepresentation/double.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/InternalRepresentation/double.c b/InternalRepresentation/double.c index 83d6e02..bb75ebe 100644 --- a/InternalRepresentation/double.c +++ b/InternalRepresentation/double.c @@ -1,4 +1,4 @@ -/* +/* В C для типа double используется стандарт IEEE 754 IEEE 754 - стандарт размещения вещественных чисел в памяти @@ -17,25 +17,26 @@ typedef union { unsigned long long bits; } DoubleUnion; -int main(void) { +int main(void) +{ DoubleUnion doubleUnion; printf("Enter a number: "); if (scanf("%lf", &doubleUnion.value) != 1) { return 1; } - + unsigned long long bits = doubleUnion.bits; - + // Берем 63 бит char sign = (bits >> 63) ? '-' : '+'; // Берем с 62 по 52 биты unsigned long long exponent = (bits >> 52) & 0x7FFUL; // Берем последние 52 бита unsigned long long mantissa = bits & 0xFFFFFFFFFFFFFUL; - - double mantissa_value = 1.0 + (double) mantissa / (1ULL << 52); - int real_exponent = (int) exponent - 1023; - + + double mantissa_value = 1.0 + (double)mantissa / (1ULL << 52); + int real_exponent = (int)exponent - 1023; + printf("Result: %c%.20g*2^%d\n", sign, mantissa_value, real_exponent); return 0;