Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование double в __int64 
:(
    Опции темы
Katshooter
Дата 15.12.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Приветик всем)))
ПОМОГИТЕ ПЛИЗ!!! 
Нужно преобразовать double в __int64 без потери данных
Явным преобразованием типа: 

Код


__int64 i64;
double d;
i64=(__int64)d;



теряю данные....

может есть какая-нить сишная функция...???

а, еще проблемка, это нада сделать на Си...
PM MAIL   Вверх
Rififi
Дата 15.12.2008, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Katshooter
Нужно преобразовать double в __int64 без потери данных
поясни глубинный смысл этой фразы.
PM MAIL   Вверх
Katshooter
Дата 15.12.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



))) сори, ну например double 12345672903000000+11E (в таком виде приходят данные), 
при при явном приведении получаем 12345672  (а ...903 округляются)
PM MAIL   Вверх
Rififi
Дата 15.12.2008, 20:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Katshooter
у тебя явно имеется талант к исчерпывающему и предельно понятному объяснению, однако. :gigi:
PM MAIL   Вверх
Void
Дата 15.12.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Кастуя телепатию, предполагаю, что требуется просто положить содержимое double в int64 побитово.
Код
__int64 i;
double d;
...
((double*)&i)* = df;
/* либо */
memcpy(&i &d, sizeof(i));


Хотя бред конечно. Но никакого другого способа всегда сохранить точное значение нет, fixed point тоже не катит.

Это сообщение отредактировал(а) Void - 15.12.2008, 21:09


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Katshooter
Дата 15.12.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



спасибо) буду пробовать)))
PM MAIL   Вверх
mes
Дата 15.12.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Void @  15.12.2008,  21:06 Найти цитируемый пост)
Хотя бред конечно. Но никакого другого способа всегда сохранить точное значение нет, fixed point тоже не катит.

по численному значению при таком способе сохранения переменные разных типов будут отличаться.. 
Т.е. использовать значения не приведя обратно к double просто бессмысленно.

Добавлено через 6 минут и 33 секунды
Цитата(Katshooter @  15.12.2008,  20:28 Найти цитируемый пост)
Нужно преобразовать double в __int64 без потери данных

во первых int64 не сможет сохранить дробную часть числа, но даже если это не нужно то :
во вторых разброс значений целочисленной части double гораздо больше чем может вместить int64
следовательно решить задачу с вышеозвученным условием не реально.


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 15.12.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(mes @  15.12.2008,  22:46 Найти цитируемый пост)
во вторых разброс значений целочисленной части double гораздо больше чем может вместить int64следовательно решить задачу с вышеозвученным условием не реально.

насколько я понимаюб, человеку нужно сериализовать double
в int64 записать его реально - побитово

а вот как обстоят дела с разным представлением double числа на разных платформах (та даже на 2х exe-шках, собранных разными компиляторами), я не знаю. возможно double там представляется совсем по-разному, и тупое побитовое сохранение не приведет ни к чему хорошему


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 15.12.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alek86 @  15.12.2008,  23:03 Найти цитируемый пост)
насколько я понимаюб, человеку нужно сериализовать double
в int64 записать его реально - побитово

вот этот набросок каста
http://forum.vingrad.ru/index.php?showtopi...t&p=1721438
"предназначеный" для битового конвертирования с проверкой размера, и он более безопасен чем простое побитовое сохранение,
но код приспособленный под одну платформу не будет компилиться на другой. 
К  тому же его в той же теме и заругали, поэтому желаю 7 раз обдумать прежде чем использовать.






--------------------
PM MAIL WWW   Вверх
J0ker
Дата 15.12.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Alek86 @  15.12.2008,  23:03 Найти цитируемый пост)
та даже на 2х exe-шках, собранных разными компиляторами

компилятор тут обычно не при чем
числа с ПТ хранятся в формате, пригодном для загрузки в FPU целевой платформы


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 15.12.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Katshooter @  15.12.2008,  20:28 Найти цитируемый пост)

а, еще проблемка, это нада сделать на Си... 

на си можно таже сделать подобный макрос который будет проверять размер и предупреждать, если результат не "вписывается" в хранилище.



--------------------
PM MAIL WWW   Вверх
J0ker
Дата 15.12.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Void @  15.12.2008,  21:06 Найти цитируемый пост)
((double*)&i)* = df;

во-первых d, а не df
во-вторых *((double*)&i)
а в третьих это UB насколько я понимаю


--------------------
user posted image
PM MAIL   Вверх
Earnest
Дата 17.12.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Да чего там, если размер одинаков, просто union - старый сишный метод. 
Код

union DblToInt64
{
   double f; 
   int64   n;
};

Ну и assert на равенство размеров, на всякий случай... 
И нет там никакого UB.


--------------------
...
PM   Вверх
J0ker
Дата 17.12.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Earnest @  17.12.2008,  17:54 Найти цитируемый пост)
И нет там никакого UB. 

3.10/15
Цитата

If a program attempts to access the stored value of an object through an lvalue of other than one of the following
types the behavior is undefined48):
— the dynamic type of the object,
— a cv-qualified version of the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic type of
the object,
— an aggregate or union type that includes one of the aforementioned types among its members (including,
recursively, a member of a subaggregate or contained union),
— a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
— a char or unsigned char type.

хотя не совсем понятно, что включает в себя "attempts to access" - но, ИМХО, и запись и чтение


Это сообщение отредактировал(а) J0ker - 17.12.2008, 20:40


--------------------
user posted image
PM MAIL   Вверх
Earnest
Дата 18.12.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Нет, в данном контексте это использование по назначению - т.е. в вычислениях (или в присваивании).
И потом, никто не говорит, что UB - это когда программа падает. Это просто значит, что результат получится неизвестно какой.
Скажем, целая -1, если ее таким образом преобразовать в double становится Not-a-number. И что там в вычислениях получится -  хто знает. 
Например, если сравнивать NAN с любым числом, то результат стабилен (не помню уже true или false), независимо от того, какое число и какое сравнение. С другой стороны - это не раз наблюдаемое мною поведение наверняка является свойством конкретного компилятора или может даже параметров компиляции (release-debug).

А писать-читать в память ты можешь что угодно - была бы память. Это ведь по сути ничем не отличается от memcpy, как предложил Void, только запись яснее (на мой взгляд).  Reinterpret_cast биты не портит... Т.е. если ты запихиваешь, скажем float в LPARAM, чтобы послать сообщение, а потом его оттуда извлекаешь обратной операцией, то все совершенно нормально и легально.


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1297 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.