![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Katshooter |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 10.6.2007 Репутация: нет Всего: 1 |
Приветик всем)))
ПОМОГИТЕ ПЛИЗ!!! Нужно преобразовать double в __int64 без потери данных Явным преобразованием типа:
теряю данные.... может есть какая-нить сишная функция...??? а, еще проблемка, это нада сделать на Си... |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
Katshooter,
Нужно преобразовать double в __int64 без потери данных поясни глубинный смысл этой фразы. |
|||
|
||||
Katshooter |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 10.6.2007 Репутация: нет Всего: 1 |
))) сори, ну например double 12345672903000000+11E (в таком виде приходят данные),
при при явном приведении получаем 12345672 (а ...903 округляются) |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
Katshooter,
у тебя явно имеется талант к исчерпывающему и предельно понятному объяснению, однако. :gigi: |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Кастуя телепатию, предполагаю, что требуется просто положить содержимое double в int64 побитово.
Хотя бред конечно. Но никакого другого способа всегда сохранить точное значение нет, fixed point тоже не катит. Это сообщение отредактировал(а) Void - 15.12.2008, 21:09 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Katshooter |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 10.6.2007 Репутация: нет Всего: 1 |
спасибо) буду пробовать)))
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
по численному значению при таком способе сохранения переменные разных типов будут отличаться.. Т.е. использовать значения не приведя обратно к double просто бессмысленно. Добавлено через 6 минут и 33 секунды во первых int64 не сможет сохранить дробную часть числа, но даже если это не нужно то : во вторых разброс значений целочисленной части double гораздо больше чем может вместить int64 следовательно решить задачу с вышеозвученным условием не реально. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
насколько я понимаюб, человеку нужно сериализовать double в int64 записать его реально - побитово а вот как обстоят дела с разным представлением double числа на разных платформах (та даже на 2х exe-шках, собранных разными компиляторами), я не знаю. возможно double там представляется совсем по-разному, и тупое побитовое сохранение не приведет ни к чему хорошему |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот этот набросок каста http://forum.vingrad.ru/index.php?showtopi...t&p=1721438 "предназначеный" для битового конвертирования с проверкой размера, и он более безопасен чем простое побитовое сохранение, но код приспособленный под одну платформу не будет компилиться на другой. К тому же его в той же теме и заругали, поэтому желаю 7 раз обдумать прежде чем использовать. |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
компилятор тут обычно не при чем числа с ПТ хранятся в формате, пригодном для загрузки в FPU целевой платформы |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
на си можно таже сделать подобный макрос который будет проверять размер и предупреждать, если результат не "вписывается" в хранилище. |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
во-первых d, а не df во-вторых *((double*)&i) а в третьих это UB насколько я понимаю |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да чего там, если размер одинаков, просто union - старый сишный метод.
Ну и assert на равенство размеров, на всякий случай... И нет там никакого UB. -------------------- ... |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
3.10/15
хотя не совсем понятно, что включает в себя "attempts to access" - но, ИМХО, и запись и чтение Это сообщение отредактировал(а) J0ker - 17.12.2008, 20:40 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Нет, в данном контексте это использование по назначению - т.е. в вычислениях (или в присваивании).
И потом, никто не говорит, что UB - это когда программа падает. Это просто значит, что результат получится неизвестно какой. Скажем, целая -1, если ее таким образом преобразовать в double становится Not-a-number. И что там в вычислениях получится - хто знает. Например, если сравнивать NAN с любым числом, то результат стабилен (не помню уже true или false), независимо от того, какое число и какое сравнение. С другой стороны - это не раз наблюдаемое мною поведение наверняка является свойством конкретного компилятора или может даже параметров компиляции (release-debug). А писать-читать в память ты можешь что угодно - была бы память. Это ведь по сути ничем не отличается от memcpy, как предложил Void, только запись яснее (на мой взгляд). Reinterpret_cast биты не портит... Т.е. если ты запихиваешь, скажем float в LPARAM, чтобы послать сообщение, а потом его оттуда извлекаешь обратной операцией, то все совершенно нормально и легально. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |