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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Как определить порядок бит в double? - C++

24.12.2014, 15:45. Просмотров 2277. Ответов 47
Метки нет (Все метки)

Как определить порядок бит в double?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2014, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как определить порядок бит в double? (C++):

Too few parametrs in call to '_fastcall LogN(cont log double, const long double)' - C++ Builder
void __fastcall TForm1::Button1Click(TObject *Sender) {int n; double y,a=1.5,b=0.7,z=3.2,x=StrToFloat(Edit1->Text); ...

Ошибка e2015 ambiguity between(double,double) в функции - C++ Builder
Функция: void gmdh1() ; { double poly; double work; unsigned short int ind; unsigned short int ma; double rms; double ww,...

Как удалить один бит из числа? - C++ Builder
Как программно сделать то, что на картинке?

Как обьявить и инициализировать массив через new в 32 бит? - C++ Builder
Как объявить и инициализировать массив через new в 32 бит? На 64 бит вот так: const char *string = new char {108,102,104,'\0'};

Как вывести double в string - C++ Builder
Стало не хватать int, решил воспользоваться double выводил раньше так: int sum_in; temp = "Итого: " + IntToStr(sum_in) + "...

Как вывести double в MessageBox'е? - C++ Builder
Пробывал преобразовать в строковый: char buf; double time = clock () / CLOCKS_PER_SEC; itoa(time, buf, 16); MessageBox(0, "Вы...

47
DukeNukem
Заблокирован
24.12.2014, 16:24 #2
https://ru.wikipedia.org/wiki/%D0%A7...81%D1%82%D0%B8
 Комментарий модератора 
Правило п 5.20 Запрещено публиковать ответы на вопросы или решения задач с форума на другие сайты и давать на них ссылки в качестве ответа.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.12.2014, 17:03  [ТС] #3
Число́ двойно́й то́чности (Double precision, Double) — компьютерный формат представления числа с плавающей запятой, занимающий в памяти 64 бита, или 8 байт. Как правило, обозначает числа с плавающей запятой стандарта IEEE 754.
Меня не устраивает "как правило". А если на машине одного юзверя не IEEE 754, а у другого как раз именно IEEE 754? При попытке обменяться файлами, данные будут прочитаны не правильно. Как определить? Или как гарантированно преобразовать внутреннее представление в IEEE 754 и IEEE 754 во внутреннее представление?
0
Ilot
Модератор
Эксперт С++
1820 / 1178 / 232
Регистрация: 16.05.2013
Сообщений: 3,115
Записей в блоге: 5
Завершенные тесты: 1
24.12.2014, 17:30 #4
taras atavin, обрабатывайте:
C++
1
2
if(std::numeric_limits<double>::is_iec559 == true)
    ...
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
24.12.2014, 17:38 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
А если на машине одного юзверя не IEEE 754, а у другого как раз именно IEEE 754? При попытке обменяться файлами, данные будут прочитаны не правильно.
Можно число в строке хранить, типа "123.345", после прочтения конвертировать в double.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.12.2014, 17:43  [ТС] #6
А в бинарном? А то как то эта десятичная пахнет искажениями при каждом сохранении/загрузке файла, а если отводить по целому байту на двоичную цифру, то получится громоздко.

Добавлено через 2 минуты
Цитата Сообщение от Ilot Посмотреть сообщение
if(std::numeric_limits<double>::is_iec559 == true)
Допустим. А если false, то закрывать приладу?
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
24.12.2014, 22:38 #7
Хранить знак, мантису и порядок в int'ах. При чтении собирать в double.

Вопрос чисто ради интереса или программа реально разрабатывается под не IEEE 754?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.12.2014, 05:27  [ТС] #8
Я вообще не знаю, что будет у пользователя. А как узнать количество бит порядка и мантисы?
0
Fulcrum_013
Заблокирован
25.12.2014, 06:59 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Я вообще не знаю, что будет у пользователя. А как узнать количество бит порядка и мантисы?
Собираешь ручками из интов любую константу и сравниваешь с заданной в double. если не совпало - меняешь количество бит в порядке и т.д. пока не совпадет. Это если надо узнать какой формат у тебя в приладе, хотя это можно просто продефайнить под каждый таргет. Если надо в файле - то соответственно то же самое, только надо знать значение хотя бы одного из double в файле, хотя в таком случае проще писать интом в начале файла количество бит мантиссы и порядка.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.12.2014, 07:04  [ТС] #10
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Собираешь ручками из интов любую константу и сравниваешь с заданной в double. если не совпало - меняешь количество бит в порядке и т.д. пока не совпадет.
Не понял. Какой заданной?
0
Fulcrum_013
Заблокирован
25.12.2014, 07:33 #11
к примеру задаешь
C++
1
2
3
4
5
6
const double a=123.456;
//и делаешь функцию:
double MakeFloat(int IntegerPart, int DecimalPart, int PowerBits);
//ну а дальше
int PowerBits=1;
while(MakeFloat(123,456,PowerBits++)!=a);
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.12.2014, 07:39  [ТС] #12
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это если надо узнать какой формат у тебя в приладе, хотя это можно просто продефайнить под каждый таргет. Если надо в файле - то соответственно то же самое,
Есть прилада, она сохраняет файл, в памяти было какие то числа типа double, эти числа пишутся в файл. Потом файл читается, возможно на другой машине, возможно другим приложением. Спецификация формата будет выложена в сетке, если стороннее приложение должно его поддерживать, читайте и соблюдайте. Требуется перед самими числами сохранить sizeof(double), отведя на него 64 бита. Перед этим полем уже размещёны префиксные коды и текстовое поле в семибитном ascii. Конечно очень весело грузить с диска текст, в котором символы не кратны байту, но это уже реализовано. А после sizeof(double) надо записать разрядности мантиссы и порядка, порядок частей числа, включая его знак, веса каждого бита, поддерживается ли нормализованная и денормализованная формы и каким именно кодом, хранятся ли мантиссы отрицательных чисел в прямом, или дополнительном коде, а только потом сами числа. Приложение, которое читает файл, должно прочитать все эти разрядности и порядки, потом прочитать сами числа и преобразовать их в некоторое внутреннее представление, а при сохранении файла сохранить все числа уже в своём внутреннем представлении и тоже перед этим записать sizeof(double), разрядности разрядности мантиссы и порядка, порядок частей числа, включая его знак, веса каждого бита, поддерживается ли нормализованная и денормализованная формы и каким именно кодом, хранятся ли мантиссы отрицательных чисел в прямом, или дополнительном коде. Ну знаете, как tiff может хранить данные и в little-endian, и в big-endian. Вот то самое нужно для double. Для целых понятно: сохранить разрядность числа и порядок байт, причём, порядок байт можно закодировать числом той же разрядности, в котором каждый байт равен его порядку по старшенству. То есть, например, для восьмибайтных чисел порядок - это число 0706050403020100 hex, если при чтении файла прочиталось 0001020304050607 hex, 0302010007060504 hex, 0405060700010203 hex, или любое другое значение кода порядка, то для преобразования восьмибайтных числе во внутреннее представление их надо подвергнуть такой же перестановке байтов, при которой прочитанный код порядка превратится в 0706050403020100 hex. А как быть с числами с плавающей запятой?
0
Fulcrum_013
Заблокирован
25.12.2014, 07:40 #13
еще вариант - побитно сравниваешь начиная со старшего разряда две double -1 и 1. там где начинается несовпадение - начинается мантисса.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.12.2014, 07:49  [ТС] #14
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
const double a=123.456; //и делаешь функцию: double MakeFloat(int IntegerPart, int DecimalPart, int PowerBits); //ну а дальше int PowerBits=1; while(MakeFloat(123,456,PowerBits++)!=a);
Что за фигня? Это всегда
C++
1
return ((double)123)+((double)456)/((double)1000);
, разрядности нет места, делитель считается целочисленным умножением в цикле на десять, то есть имеем:
C++
1
2
3
4
5
6
7
double MakeFloat(int IntegerPart, int DecimalPart, int PowerBits)
{
 int d;
 int t;
 for (d=1, t=DecimalPart; t!=0; d*=10, t/=10);
 return ((double)IntegerPart)+((double)DecimalPart)/((double)d);
}
.

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
еще вариант - побитно сравниваешь начиная со старшего разряда две double -1 и 1. там где начинается несовпадение - начинается мантисса.
В IEEE 754 они различаются единственным битом знака числа, так как мантисса хранится в прямом коде.
0
Fulcrum_013
Заблокирован
25.12.2014, 07:51 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
А как быть с числами с плавающей запятой?
посчитать количество бит в мантиссе и порядке и записать к примеру char-ом. в один байт каждый они поместятся. Ну или интом, способ кодирования которого уже известен. А то что инт может выглядеть по разному связано с порядком байт в слове, и соответственно порядок аналогичный как для слова, так и для двойного слова и т.д. то есть - формат двойного слова (ну или четверного - для 16bit) - это формат не самого double а формат его упаковки в слове, который соответствует таковому у инта, и задача такой перепаковки решается указанным вами способом. А вот double надо после этой перепковки еще и приводить к формату по количеству бит показателя/мантиссы.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
double MakeFloat(int IntegerPart, int DecimalPart, int PowerBits)
{
*int d;
*int t;
*for (d=1, t=DecimalPart; t!=0; d*=10, t/=10);
*return ((double)IntegerPart)+((double)DecimalPart)/((double)d);
}
а теперь тоже самое только не используя double, а пользуясь битовым сдвигом
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2014, 07:51
Привет! Вот еще темы с ответами:

Как выводить в Edit тип данных Double ? - C++ Builder
Всем доброго вечера. Написал программу формулу для расчета вот код программы (кнопки): void __fastcall TForm1::Button1Click(TObject...

Как избавиться от погрешности при выводе double? - C++ Builder
После того, как считал строку &quot;3,2&quot;, перевожу во float, затем складываю с другим числом и получаю хрень непонятную что-то вроде 1,2+2=...

Как изменить порядок запуска форм в C++ builder - C++ Builder
Как изменить порядок запуска форм в C++ builder? К примеру чтобы при запуске программы вместо Form1 запускалась Form2.

Как записать произвольное число бит в файл?! - Visual C++
Всем привет.. Очень нужна ваша помощь! Как записать в файл 1 бит или любое произвольное число битов?


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
25.12.2014, 07:51
Ответ Создать тему
Опции темы

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