Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
#1

double на диске. - C++

16.10.2009, 20:05. Просмотров 1254. Ответов 13
Метки нет (Все метки)

Нужно самому прочитать число double, записанное на диск, и получить double. Записал числа -3,-2,-1,0,1,2,3. Получил на диске - 00000000000008C0,00000000000000C0,000000000000F0BF,0000000000000000,000000000000F03F,0000000000000040,0000000000000840. Перевёл в двоичный формат, но никак не уловлю, почему такой порядок и такая мантисса? Какой алгоритм перевода в double?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2009, 20:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос double на диске. (C++):

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

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

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

Исправить ошибки "cannot convert 'double (*)(double)' to 'double'" и "too many arguments to function" - C++
пожалуйста проверьте и помогите исправить ошибки: #include<iostream> #include<stdio.h> #include<math.h> #include<stdlib.h> ...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

13
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.10.2009, 20:50 #2
64 бита (8 байт), первый бит - знаковый, потом 11 бит - экспонента, оставшиеся 52 бита - мантисса (подробнее - IEEE 754)
вот

Добавлено через 4 минуты
может поможет
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
16.10.2009, 21:25 #3
И напомним, что в приведённой записи байты идут в обратном порядке, т.е. это на самом деле C0 08 00 00 00 00 00 00, C0 00 00 00 00 00 00 00 и т.д.
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.10.2009, 11:14  [ТС] #4
Перевернём байты и переведём в биты 2 крайних байта(остальные байты нули).
+1 - 0011 1111 1111 0000 - 0-это плюс,дальше 11 битов - это порядок. А мантисса - 0000.
+2 - 0100 0000 0000 0000 - тоже самое, а где число в мантиссе?
+3 - 0100 0000 0000 1000 - наконец-то в мантиссе появилась 1!
+4 - 0100 0000 0001 0000 - опять в мантиссе нули!
Не вижу никакой логики. Поскажите алгоритм перевода таких чисел в вещественные.
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
17.10.2009, 15:24 #5
Мантисса в двоичном виде всегда выглядит как 1.???????..., где ? - двоичные цифры. В представлении floating point, естественно, эта фиксированная единица не хранится, хранятся только изменяющиеся биты. Экспонента хранится в виде "со смещением": эти 11 битов представляют собой неотрицательное число, для получения степени из него надо вычесть 1023. Значения экспоненты 0 и 2047 (естественно, БЕЗ смещения на -1023) трактуются особо. Значение экспонентой 0 и мантиссой 0 означает 0 (плюс или минус, ненулевая мантисса обозначает сверхмалое число. При экспоненте 2047 и мантиссе 0 это плюс-минус бесконечность, при ненулевой мантиссе NAN (Not A Number, не число).
Разберём твои примеры:
+1 - знак 0 степень 011 1111 1111 = 1023, со смещением 0, мантисса (1.) 0000 ... - получаем b1.000 * 2^0
+2 - знак 0 степень 100 0000 0000 = 1024, со смещением 1024-1023=1, мантисса (1.) 0000 - получаем 1.000 * 2^1 = 2
+3 - знак 0 степень 100 0000 0000 = 1024, со смещением 1, мантисса (1.)1000 , итого b1.1000 * 2^1 = b11.000... = 3
Ну как, идея ясна?
P.S. Аглицкая Вика о формате double
1
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.10.2009, 22:28 #6
Какой алгоритм перевода в double?
Так же как записал - так и прочитай.
C
1
2
3
double a;
 
fread( &a, sizeof(a), 1, fin );
Добавлено через 1 минуту
Тебе не нужно переводить в double !
Ты записываешь бинарный формат числа double на диск.
Потом считываешь его прямо в бинарном формате.
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.10.2009, 22:40  [ТС] #7
Дело в том, что у double обрезаны два младших байта и число занимает не 8, а 6 байтов. Так ,что ,видимо, придётся осваивать алгоритм перевода вручную в double.
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
18.10.2009, 18:35 #8
Где 6 байтов ?
00000000000008C0 - это 8 байтов.
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
18.10.2009, 18:44  [ТС] #9
Это нестандартный прибор обрезает 2 младших байта и пишет 6 вместо 8-ми. А я сам пока пробую на стандартных 8-ми. Может надо взять эти 6 и, добавив 2 байта с нулями, опять записать на диск. А потом попробовать прочитать как стандартный double? Хотя всё равно надо освоить алгоритм перевода в double.
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
19.10.2009, 12:03 #10
Насколько я знаю бинарное представление вещественных чисел стандартно.
Что там за тип записывается в 6-байт не знаю.
Думаю нужно начать с изучения прибора
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
19.10.2009, 18:31  [ТС] #11
Nick Alte, Спасибо! С ненулевой частью double и нулевой дробной разобрался. А какой алгоритм, если дробная не равна нулю?

1.1 - 009A9999999999F13F;
1.01 - 00295C8FC2F528F03F;
1.001 - 006ABC74931804F03F;
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.10.2009, 19:00 #12
Мантисса, разумеется, представлена как ДВОИЧНАЯ дробь. Рост степеней двойки при движении по позиции тебе уже знаком. При заходе за точку показатель просто уходит в минус. То есть, 1 на 3 позиции после точки означает 2^(-3) = 1 / (2^3) = 1/8 = 0.125

0.5 = b0.1
0.25 = b0.01
0.125 = b0.001
1.375 = b1.011
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.11.2009, 19:59  [ТС] #13
Nick Alte, Соотношение порядок - мантисса для float - 8-23, для double 11-52, для long double 15-64. А есть ещё 12-ти и 16-ти байтовые числа с плавающей запятой, ипа long-long double. Не подскажете какое у них соотношение порядка и мантиссы?
0
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
21.11.2009, 15:10  [ТС] #14
Соотношение порядка и мантиссы: для 32bit 8 - 23, для 64bit 11 -52, а для 80bit и 128it получается одинаково 15 - 64 и 15 - 112? Или для 128 всё-таки другое?
0
21.11.2009, 15:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2009, 15:10
Привет! Вот еще темы с ответами:

Какая-нибудь реализация функции void Fun (double in, double *out) - C++
Подскажите, пожалуйста, какую-нибудь любую реализацию прототипа функции: void Fun (double in, double *out)

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

Error: invalid types 'double [10][10][double]' for array subscript - C++
В 20 21 и 23 строках выдает ошибку error: invalid types 'double ' for array subscript #include <iostream> #include <conio.h> #include...

std::copy из vector<double> в *double, непонятный warning - C++
double myD={10,20,30,40,50,60,70}; std::vector&lt;double&gt; myvector (7); std::copy ( myD, myD+7, myvector.begin() ); std::copy (...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru