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

C++

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

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

24.12.2014, 15:45. Просмотров 2389. Ответов 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
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 07:56  [ТС] #16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
посчитать количество бит в мантиссе и порядке и записать к примеру char-ом. в один байт каждый они поместятся.
Поместятся то они конечно поместятся. А как записать?

Добавлено через 47 секунд
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а теперь тоже самое только не используя double, а пользуясь битовым сдвигом
В целом? И получим 123 ровно.
0
Fulcrum_013
Заблокирован
25.12.2014, 08:04 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
В целом? И получим 123 ровно.
Нет, ты не понял. Формат представления double основан двух интах(размером не целое количество байт) - один мантисса, другой показатель. Собери double вручную (ну как эмулятор FPU собирает, только с заданным количеством бит)и сравни совпало ли с тем как собирается штатными средствами. Варианты перебери в цикле. Когда совпало - вариант представления известен.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Поместятся то они конечно поместятся. А как записать?
А записать в той приладе которая генерит файл.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 08:09  [ТС] #18
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну или интом, способ кодирования которого уже известен. А то что инт может выглядеть по разному связано с порядком байт в слове, и соответственно порядок аналогичный как для слова, так и для двойного слова и т.д.
Чёрта с два. Существует ещё смешанный порядок, то есть такой, при котором порядок байт в слове не совпадает с порядком слов в двойном слове, или двойных слов в четверном слове. В общем случае смешанного порядка порядок байт может даже не совпадать в разных словах одного двойного слова, или байты одного слова значения могут быть раскиданы по разным словам кода. В спецификации заявлена поддержка вообще всех возможных порядков байтов. Для слов это два порядка:
Номер байтаадрес
0&x
1((char*)&x)+1
и
Номер байтаадрес
0((char*)&x)+1
1&x
. Для двойных слов уже я насчитал уже 24 порядка.
0
Fulcrum_013
Заблокирован
25.12.2014, 08:16 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
Чёрта с два. Существует ещё смешанный порядок, то есть такой, при котором порядок байт в слове не совпадает с порядком слов в двойном слове, или двойных слов в четверном слове.
В любом случае double будет соответствоват 8-байтному (ну или сколько там в определенном таргете байт на double) инту. т.к. double кодируется уже внутри двойного/четверного слова. Соответственно перекодируешь слова/двойные/четверные/восьмерные или какие они там есть, а потом перекодируешь внутри них double. В любом случае формат записи т.е по какому адресу и какой длины значение должен быть известен заранее.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 08:26  [ТС] #20
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну или интом, способ кодирования которого уже известен. А то что инт может выглядеть по разному связано с порядком байт в слове, и соответственно порядок аналогичный как для слова, так и для двойного слова и т.д.
Чёрта с два. Существует ещё смешанный порядок, то есть такой, при котором порядок байт в слове не совпадает с порядком слов в двойном слове, или двойных слов в четверном слове. В общем случае смешанного порядка порядок байт может даже не совпадать в разных словах одного двойного слова, или байты одного слова значения могут быть раскиданы по разным словам кода. В спецификации заявлена поддержка вообще всех возможных порядков байтов. Для слов это два порядка:
Номер байтаадрес
0&x
1((char*)&x)+1
и
Номер байтаадрес
0((char*)&x)+1
1&x
. Для двойных слов я уже насчитал 24 порядка байт. Но это уже сделано. Любой порядок байтов в четверном слове однозначно кодируется таким четверным словом, что если на читающей машине порядок байт в четверном слове отличается, то оно будет искажено при чтении, чему оно должно быть равно известно из спецификации формата и любое другое четверное слово в файле подлежит такой перестановке байтов, при выполнении которой к четверному слову, кодирующему порядок байт в четверных словах будет устранено его искажение, вызванное не совпадением порядка байт в четверных словах. Так как порядок байт во всех четверных словах на одной машине одинаков, то такая перестановка восстанавливает значение любого искажённого не совпадением порядка четверного слова во всём файле.

Добавлено через 3 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
В любом случае double будет соответствоват 8-байтному (ну или сколько там в определенном таргете байт на double) инту. т.к. double кодируется уже внутри двойного/четверного слова. Соответственно перекодируешь слова/двойные/четверные/восьмерные или какие они там есть, а потом перекодируешь внутри них double.
Напоследок поучительная история. Когда я работал над тестовым проектом на GPU, у меня была последовательная и параллельная версия одной программы. Сравнив время выполнения, я был очень обрадован, так как получил ускорение в 300 раз. Но позже оказалось, что вычисления на GPU «разваливались» и обращались в NaN, а работа с ними в GPU была быстрее, чем с обычными числами. Интересно было другое — одна и та же программа на эмуляторе GPU (на CPU) выдавала корректный результат, а на самом GPU – нет. Позже оказалось, что проблема была в том, что этот GPU не поддерживал полностью стандарт IEEE754 и прямой подход не сработал.
http://habrahabr.ru/post/112953/.

Добавлено через 4 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Нет, ты не понял. Формат представления double основан двух интах(размером не целое количество байт) - один мантисса, другой показатель. Собери double вручную (ну как эмулятор FPU собирает, только с заданным количеством бит)и сравни совпало ли с тем как собирается штатными средствами. Варианты перебери в цикле. Когда совпало - вариант представления известен.
А если совпало случайно? И потом 456 тысячных уже не приводятся к двоичной дроби и ни какой сдвиг не поможет. То есть мантисса на самом деле не равна 123456 с каким бы то нибыло сдвигом.
0
Fulcrum_013
Заблокирован
25.12.2014, 08:43 #21
Цитата Сообщение от taras atavin Посмотреть сообщение
Для слов это два порядка
Кстати слово это не два байта. Это размер данных с которыми оперирует проц за одну операцию. т.е для 4040 слово 0,5 байт, для 8080 - 1 байт, для 8086-2 байта, для 80386-4 байта для x64 - 8 байт. Хотя конечно со времен 8086 прижилось 2 байта.
Цитата Сообщение от taras atavin Посмотреть сообщение
И потом 456 тысячных уже не приводятся к двоичной дроби и ни какой сдвиг не поможет
естественно не приводятся, приводятся с точностью обеспечиваемой разрядной сеткой. Для того чтоб случайно не совпадали, то проверь несколько констант таким способом. Тебе насколько понимаю надо определить формат в одном таргете и в другом. Перепаковка из известного в известный формат - уже не проблема.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 08:45  [ТС] #22
Правильная мантисса 63209 dec (1111011011101001 bin) и её ни какими доичными сдвигами её из 123 dec (1111011 bin) и 456 dec (111001000) не получишь.
0
Fulcrum_013
Заблокирован
25.12.2014, 08:46 #23
ps: так и подозревал что ты дрова для GPU делаешь
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 08:47  [ТС] #24
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Для того чтоб случайно не совпадали, то проверь несколько констант таким способом.
И для гарантии все представимые? Вы себе представляете, сколько это тысячелетий?

Добавлено через 22 секунды
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ps: так и подозревал что ты дрова для GPU делаешь
Вообще то нет.

Добавлено через 57 секунд
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А записать в той приладе которая генерит файл.
Думал одно, написал другое. Как сосчитать?
0
Fulcrum_013
Заблокирован
25.12.2014, 08:58 #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Правильная мантисса 63209 dec (1111011011101001 bin) и её ни какими доичными сдвигами её из 123 dec (1111011 bin) и 456 dec (111001000) не получишь.
Для того чтобы в формат IEEE 754 (или подобный, не выровнянный на байты)запаковать уже саму мантиссу подвигать прийдется. так же как и вычисленный dec.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Как сосчитать?
Сосчитать где? В представлении в штатном double таргета на котором прилада запущена, или в файле неизвестного формата?
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 09:06  [ТС] #26
В памяти конечно. И кто сказал, что формат файла не известен? Это treepict.

Добавлено через 1 минуту
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Для того чтобы в формат IEEE 754 (или подобный, не выровнянный на байты)запаковать уже саму мантиссу подвигать прийдется. так же как и вычисленный dec.
Как предлагаете без дабла его вычислить? Сдвигами здесь ничего не получится, так как правильная дробная часть не 456 тысячных, а 233 пятсотдвенадцатых.

Добавлено через 4 минуты
Ну или 467 1024-х, тогда мантисса удлиняется ещё на одну единицу (11110110111010011 bin, 126419 dec).
0
Fulcrum_013
Заблокирован
25.12.2014, 09:07 #27
Ну в идеале продефайнить для каждого таргета. ну а если нет то именно так - конструировать double ручками во всех возможных вариантах, и сравнивать со сконструированным штатным способом. Хотя тоже бред получается. По большому счету в каком формате компилер положит константу в бинарник так она там и будет. Вообще компилер под таргет должен сразу представление знать.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 09:15  [ТС] #28
Да он то знает, но на конкретной машине, где запущен. Знать представление на других платформах он не способен.

Добавлено через 3 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
конструировать double ручками во всех возможных вариантах, и сравнивать со сконструированным штатным способом.
Эиси, сконструирую 0,75, совпадёт для одного явного и одного не явного бита мантиссы, на самом деле их 52 явных и один не явный.
0
Fulcrum_013
Заблокирован
25.12.2014, 09:27 #29
Цитата Сообщение от taras atavin Посмотреть сообщение
Да он то знает, но на конкретной машине, где запущен. Знать представление на других платформах он не способен.
Следовательно, на той на которой генерит файл писать в файл формат используемых чисел в чаре.
Если такое не возможно, то надо хотя бы знать значение (в формате платформы которая читает файл) лежащее по определенному адресу в файле. потом из значения которое есть в файле всеми способами попытаться сконструировать пока не совпадет.

Добавлено через 3 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Эиси, сконструирую 0,75, совпадёт для одного явного и одного не явного бита мантиссы, на самом деле их 52 явных и один не явный.
Должны совпасть не только мантиссы, но и порядки и размещение порядка и мантиссы в формате.

Добавлено через 3 минуты
А порядок следования байт в формате уже определен при определении интов той же размерности.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.12.2014, 11:19  [ТС] #30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Следовательно, на той на которой генерит файл писать в файл формат используемых чисел в чаре.
Как?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если такое не возможно, то надо хотя бы знать значение (в формате платформы которая читает файл) лежащее по определенному адресу в файле. потом из значения которое есть в файле всеми способами попытаться сконструировать пока не совпадет.
Опять таки не понятно. С целыми то просто: записать любую константу, у которой все байты уникальны в пределах самой константы, если прочиталась не правильно, то по прочитанному значению и по известному правильному значению однозначно определяется порядок байт на платформе-источнике и все необходимые перестановки, которые превратят это число в правильное. Этим перестановкам подвергать все остальные числа в файле. А с плавающей запятой как? Ни на фиксированную запятую, ни на обыкновенные дроби переходить не охота.

Добавлено через 4 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Должны совпасть не только мантиссы, но и порядки и размещение порядка и мантиссы в формате.
Добавлено через 3 минуты
А порядок следования байт в формате уже определен при определении интов той же размерности.
Ладно, попробую по-другому. Есть ли гарантия, что CPU любой двоичной домашней машины всегда будет поддерживать IEEE 754? Не конкретно intel-совместимый, а вообще любой, а то чёрт его знает, какие ещё платформы могут получить хотябы ограниченное распространение в указанном сегменте.
0
25.12.2014, 11:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2014, 11:19
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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