Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435

Double в памяти компьютера

04.12.2018, 16:18. Показов 3809. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Подскажите где у меня ошибка.
Хочу распарсить double и в ручную посчитать что там в байтах, получается вот так
-2.2
1 10000000000
00011 00110011 0011001 10011001 10011001 10011001 10011010
- 2^(1024-1023=1)=-2
-2*(1+(2^-51)
+(2^-49)+(2^-48)
+(2^-45)+(2^-44)
+(2^-41)+(2^-40)
+(2^-37)+(2^-36)
+(2^-33)+(2^-32)
+(2^-29)+(2^-28)
+(2^-25)+(2^-24)
+(2^-21)+(2^-20)
+(2^-17)+(2^-16)
+(2^-13)+(2^-12)
+(2^-9)+(2^-8)
+(2^-5)+(2^-3))=(-2.2)!?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main() {
    double X = -2 * (1 + (pow(2, -51))
        + (pow(2, -49)) + (pow(2, -48))
        + (pow(2, -45)) + (pow(2, -44))
        + (pow(2, -41)) + (pow(2, -40))
        + (pow(2, -37)) + (pow(2, -36))
        + (pow(2, -33)) + (pow(2, -32))
        + (pow(2, -29)) + (pow(2, -28))
        + (pow(2, -25)) + (pow(2, -24))
        + (pow(2, -21)) + (pow(2, -20))
        + (pow(2, -17)) + (pow(2, -16))
        + (pow(2, -13)) + (pow(2, -12))
        + (pow(2, -9)) + (pow(2, -8))
        + (pow(2, -5)) + (pow(2, -3)));
    cout << X << endl;
}
-2.325
Где я ошибся?

Добавлено через 36 минут
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <string>
#include <cstdlib>
#include "operBinary.h"
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[]) {
    double d = -2.2;
    unsigned char* cp =
        reinterpret_cast<unsigned char*>(&d);
    for (int i = sizeof(double) - 1; i >= 0; i--) {
        printBinary(cp[i]);
    }
    double X = -2 * (1 + (pow(2, -51))
        + (pow(2, -49)) + (pow(2, -48))
        + (pow(2, -45)) + (pow(2, -44))
        + (pow(2, -41)) + (pow(2, -40))
        + (pow(2, -37)) + (pow(2, -36))
        + (pow(2, -33)) + (pow(2, -32))
        + (pow(2, -29)) + (pow(2, -28))
        + (pow(2, -25)) + (pow(2, -24))
        + (pow(2, -21)) + (pow(2, -20))
        + (pow(2, -17)) + (pow(2, -16))
        + (pow(2, -13)) + (pow(2, -12))
        + (pow(2, -9)) + (pow(2, -8))
        + (pow(2, -5)) + (pow(2, -3)));
    cout << X << endl;
}
operBinary.h
C++
1
2
3
#pragma once
 
void printBinary(const unsigned char cVal);
operBinary.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "operBinary.h"
 
using namespace std;
 
void printBinary(const unsigned char cVal) {
    for (int i = 7; i >= 0; i--)
        if (cVal & (1 << i))
            cout << "1";
        else
            cout << "0";
    cout << endl;
}
Добавлено через 1 минуту
Вот тут функции для печати байтов/битов
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2018, 16:18
Ответы с готовыми решениями:

Представление в памяти компьютера типа double
нужна помощь в представление ВПК (в памяти компютера) тип данних double например нам дано такое: double y = -4.8e1 и хочем чтоб...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

25
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.12.2018, 22:47  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
часто встречающаяся задача
Вот что в итоге получилось
Не всегда работает, но вот число типа -5.464944 раскодирует
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int main() {
    double X = -5.464944;
    double S = 1;
    double M = 1;
    double E = 0;
    double E2 = 0;
    double R = 0;
 
    unsigned char* cp = reinterpret_cast<unsigned char*>(&X);
 
    int C = 0;
    for (int j = sizeof(double) - 1; j >= 0; j--)
        for (int i = 7; i >= 0; i--) {
            if (cp[j] & (1 << i)) {
                if (C == 0) S = -1;
                if (C >= 1 && C <= 11) E2 += pow(2, C - 1);
                if (C > 11) M += pow(2, (-1 * (C - 11)));
                cout << "1";
            }
            else
                cout << "0";
 
            C++;
        }
 
    cout << endl;
 
    E = pow(2, (E2 - 1023));
    R = S * (M * E);
 
    cout << "cunt:" << C << endl;
    cout << "norm:" << X << endl;
    cout << "mant:" << M << endl;
    cout << "expn:" << E2 << endl;
    cout << "expn:" << E << endl;
    cout << "resl:" << R << endl;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
04.12.2018, 23:10
Цитата Сообщение от Leningradeс Посмотреть сообщение
Вот что в итоге получилось
"Работать" это может только случайно. E2 вычисляется неправильно.

Да и использование плавающего типа для E и E2 и функции pow для них - плохо. Величину E2 можно было выцарапать из представления в готовом виде, а не заниматься копированием битов через pow.
0
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.12.2018, 23:28  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Работать" это может только случайно.
C++
1
if (C >= 1 && C <= 11) E2 += pow(2, 11 - C);
Так вот?

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
не заниматься копированием битов через pow.
Я просто другого способа не знаю пока что...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
05.12.2018, 04:51
Цитата Сообщение от Leningradeс Посмотреть сообщение
Я просто другого способа не знаю пока что...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  double src = 0.0000123;
 
  // Рассматриваем как 64-битное целое
  std::uint64_t b;
  std::memcpy(&b, &src, sizeof src);
 
  // Разбираем число на знак, экспоненту и мантиссу
  std::uint8_t s = b >> 63;
  std::int16_t e = (b >> 52) & 0x7FF;
  std::uint64_t m = b & 0xFFFFFFFFFFFFF;
 
  // Представляем мантиссу как плавающее число
  double d = 1 + m * 0x1p-52;
 
  // Умножаем на 2^(e-1023)
  d *= std::exp2(e - 1023);
 
  // Знак
  if (s != 0)
    d = -d;
 
  // Готово
  std::cout << std::setprecision(80) << src << std::endl;
  std::cout << std::setprecision(80) << d << std::endl;
2
 Аватар для COKPOWEHEU
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,887
05.12.2018, 11:35
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У типа double в С++ нет никакого конкретного формата.
Точно? Потому что у Си есть:
IEC 60559 floating-point arithmetic
F.1 Introduction
This annex specifies C language support for the IEC 60559 floating-point standard. The IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for microprocessor systems, second edition (IEC 60559:1989), previously designated IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE 754−1985).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
05.12.2018, 13:31
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Точно? Потому что у Си есть:
Нет.

Во-первых, там лишь сказано, что требования IEC 60559 удовлетворяют/не противоречат требованиям языка С. То есть реализации языка С могут решить поддерживать плавающую арифметику в стиле IEC 60559. А могут решить поддерживать какую-то совсем другую плавающую арифметику.

Во-вторых, там ясно сказано, что реализации C, которые решили пойти по пути IEC 60559, будут определять макро __STDC_IEC_559__. Те реализации языка С, которые не определяют этого макро, никакого отношения к IEC 60559 не имеют и его требованиям подчинятся не будут.

В-третьих, сам IEC 60559 не накладывает однозначных требований на представление чисел. Например, экспонента в 64-ном плавающем типе может представляться как в привычном нам смещенном коде (+1023), так и в экзотическом дополнительном коде.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2018, 13:31
Помогаю со студенческими работами здесь

Обращение к double** из метода dll вызывает ошибку памяти
Есть класс который создает двухмерный массив. Этот класс экпортирую в dll и использую полученную библиотеку в программе С#. Все...

Почему мы пишем double x (double y)? а не через запятую double x,y
почему мы пишем double x (double y)? а не через запятую double x,y

Определить резидентные драйверы в памяти компьютера
/*--------------&quot;Просмотр списка драйверов.&quot;--------------*/ #include &lt;dos.h&gt; #include &lt;conio.h&gt; ...

Создать функцию с параметрами GetFunctionValue(double& a, double& b, double& c, double& x)...
Есть код что считает нужно сделать пару манипуляций что у не могу реализовать 1) создать функцию с параметрами...

Объясните задачу про представление вещественных чисел в памяти компьютера
Собственно знать как и что представляется в компе - необходимо, а особенно как представляются вещественные числа. Как я рассуждаю: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru