Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

C++ Написать программу, которая дописывает в файл Phone/txt, находящийся на диске А фамилию и номер телефона. Если файла на диске нет, то программа должна
C++ invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’
Какая-нибудь реализация функции void Fun (double in, double *out) C++
C++ Объяснить, что это значит double *F; F=new double[n];
C++ Ошибка: невозможно преобразовать 'double' в 'double'
Double, int , long double C++
Шаблон класса complex. Ошибка undefined reference to `complex<double>::SetRe(double)' C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.10.2009, 20:50     double на диске. #2
64 бита (8 байт), первый бит - знаковый, потом 11 бит - экспонента, оставшиеся 52 бита - мантисса (подробнее - IEEE 754)
вот

Добавлено через 4 минуты
может поможет
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
16.10.2009, 21:25     double на диске. #3
И напомним, что в приведённой записи байты идут в обратном порядке, т.е. это на самом деле C0 08 00 00 00 00 00 00, C0 00 00 00 00 00 00 00 и т.д.
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.10.2009, 11:14  [ТС]     double на диске. #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 - опять в мантиссе нули!
Не вижу никакой логики. Поскажите алгоритм перевода таких чисел в вещественные.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
17.10.2009, 15:24     double на диске. #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
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.10.2009, 22:28     double на диске. #6
Какой алгоритм перевода в double?
Так же как записал - так и прочитай.
C
1
2
3
double a;
 
fread( &a, sizeof(a), 1, fin );
Добавлено через 1 минуту
Тебе не нужно переводить в double !
Ты записываешь бинарный формат числа double на диск.
Потом считываешь его прямо в бинарном формате.
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.10.2009, 22:40  [ТС]     double на диске. #7
Дело в том, что у double обрезаны два младших байта и число занимает не 8, а 6 байтов. Так ,что ,видимо, придётся осваивать алгоритм перевода вручную в double.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
18.10.2009, 18:35     double на диске. #8
Где 6 байтов ?
00000000000008C0 - это 8 байтов.
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
18.10.2009, 18:44  [ТС]     double на диске. #9
Это нестандартный прибор обрезает 2 младших байта и пишет 6 вместо 8-ми. А я сам пока пробую на стандартных 8-ми. Может надо взять эти 6 и, добавив 2 байта с нулями, опять записать на диск. А потом попробовать прочитать как стандартный double? Хотя всё равно надо освоить алгоритм перевода в double.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
19.10.2009, 12:03     double на диске. #10
Насколько я знаю бинарное представление вещественных чисел стандартно.
Что там за тип записывается в 6-байт не знаю.
Думаю нужно начать с изучения прибора
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
19.10.2009, 18:31  [ТС]     double на диске. #11
Nick Alte, Спасибо! С ненулевой частью double и нулевой дробной разобрался. А какой алгоритм, если дробная не равна нулю?

1.1 - 009A9999999999F13F;
1.01 - 00295C8FC2F528F03F;
1.001 - 006ABC74931804F03F;
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
19.10.2009, 19:00     double на диске. #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
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
17.11.2009, 19:59  [ТС]     double на диске. #13
Nick Alte, Соотношение порядок - мантисса для float - 8-23, для double 11-52, для long double 15-64. А есть ещё 12-ти и 16-ти байтовые числа с плавающей запятой, ипа long-long double. Не подскажете какое у них соотношение порядка и мантиссы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2009, 15:10     double на диске.
Еще ссылки по теме:

C++ std::copy из vector<double> в *double, непонятный warning
Домашнее задание ошибки double circle_area(double R) C++
C++ Вывести long double число без перевода в double
C++ Аргумент типа double несовместим с параметром типа double
C++ Error: invalid types 'double [10][10][double]' for array subscript

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

Или воспользуйтесь поиском по форуму:
evgem
0 / 0 / 0
Регистрация: 16.10.2009
Сообщений: 10
21.11.2009, 15:10  [ТС]     double на диске. #14
Соотношение порядка и мантиссы: для 32bit 8 - 23, для 64bit 11 -52, а для 80bit и 128it получается одинаково 15 - 64 и 15 - 112? Или для 128 всё-таки другое?
Yandex
Объявления
21.11.2009, 15:10     double на диске.
Ответ Создать тему
Опции темы

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