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

Преобразование к double - C++

Восстановить пароль Регистрация
 
R_Way
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
20.09.2013, 14:04     Преобразование к double #1
Есть переменная типа Timestamp. Timestamp определен как структура:
C++
1
2
3
4
5
struct Timestamp
{
    unsigned int seconds :32;
    unsigned int fraction :32;
}
, где seconds - секунды с 1970-го, а fraction - доля секунды.
Как привести Timestamp к double, чтобы получилось число секунд в виде: seconds.fraction?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2013, 14:04     Преобразование к double
Посмотрите здесь:

Преобразование строки в double C++
Преобразование из char в double C++
преобразование из double в строку C++
C++ Преобразование из AnsiString в Double
Невозможно преобразование int в double C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.09.2013, 14:15     Преобразование к double #2
C++
1
seconds + fraction/1000.
или какие там у Вас доли.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 14:17     Преобразование к double #3
Какая доля? Десятая? Сотая? Тысячная?
Tulosba
20.09.2013, 14:20
  #4

Не по теме:

P.S. кстати :32 следовало бы убрать. Вообще не понятно, зачем тут битовые поля

R_Way
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
20.09.2013, 14:29  [ТС]     Преобразование к double #5
Структура предназначена для формата времени, который использует протокол NTP. В нем время передаётся в виде 64-битного числа секунд с фиксированной точкой (посередине, т.е. между 31 и 32 битом). Причем 32 бита - целое число секунд, а 31 бит после точки отвечает за точность, позволяя передавать время с точностью до 0,2 нс.
И вот этот формат нужно перевести в double.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 15:07     Преобразование к double #6
Ну тогда видимо так: double t = seconds + (double)fraction / 0x100000000;

Добавлено через 7 минут
Все же лучше константу записать так: (1ull << 32)
R_Way
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
20.09.2013, 15:08  [ТС]     Преобразование к double #7
Спасибо, очень помогло!
Есть еще вопрос - как сделать обратное преобразование?)) Очень нужно.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 15:21     Преобразование к double #8
secs = (int)floor( t );
frac = (int)((t - secs) * 0x100000000ull);

Мозги отказываются думать.. По-моему так.
R_Way
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
20.09.2013, 15:27  [ТС]     Преобразование к double #9
Спасибо, похоже на правду
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.09.2013, 15:28     Преобразование к double #10
castaway, есть еще modf() для этих целей.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 15:45     Преобразование к double #11
Это не тот случай чтобы прибегать к modf, к тому же он более ресурсоемок.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.09.2013, 16:47     Преобразование к double #12
Цитата Сообщение от castaway Посмотреть сообщение
Это не тот случай чтобы прибегать к modf
Почему не тот? Задача извлечь целую и дробную части. Прям как в описании функции.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 17:39     Преобразование к double #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему не тот?
Потому что это можно сделать намного быстрее не используя fmod, т.к. размер целой и дробной части нам известен.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.09.2013, 18:01     Преобразование к double #14
Цитата Сообщение от castaway Посмотреть сообщение
Потому что это можно сделать намного быстрее
Небольшой тестик http://ideone.com/ZHbltS
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.09.2013, 18:53     Преобразование к double #15
Tulosba, спасибо. Но можешь поставить тип для fractpart и intpart как целочисленный в моем случае?
А я пока еще на код посмотрю, если ты не против
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.09.2013, 14:01     Преобразование к double #16
castaway, так можно было и самому форкнуть http://ideone.com/rRG6Hq
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 14:03     Преобразование к double #17
Да я уже зарегился там, проверил и правда, modf почему-то работает быстрее. Я над этим до сих пор думаю)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.09.2013, 14:42     Преобразование к double #18
Цитата Сообщение от castaway Посмотреть сообщение
Да я уже зарегился там
регаться, кстати, необязательно.
Цитата Сообщение от castaway Посмотреть сообщение
modf почему-то работает быстрее
Функции стандартной библиотеки жутко оптимизированные. Чтобы понять причины надо в исходники libm какой-нибудь смотреть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2013, 16:35     Преобразование к double
Еще ссылки по теме:

Преобразование из string в double C++
C++ Преобразование long double в char
Преобразование double в bool C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 16:35     Преобразование к double #19
Цитата Сообщение от Tulosba Посмотреть сообщение
Функции стандартной библиотеки жутко оптимизированные.
Если честно, то не так уж и жутко.
Цитата Сообщение от Tulosba Посмотреть сообщение
Чтобы понять причины надо в исходники libm какой-нибудь смотреть.
Да, я покопал. В общем набросал небольшой тест: http://ideone.com/lUBX1A
modf действительно быстрее floor, видимо потому, что floor сама по себе более сложнее, а может быть frndint (используемая в floor) просто медленнее fprem, которая используется в modf.

В примере родные функции медленнее, из-за того что в них обрабатываются всевозможное ошибки и исключительные ситуации.
Yandex
Объявления
21.09.2013, 16:35     Преобразование к double
Ответ Создать тему
Опции темы

Текущее время: 18:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru