Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
1

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

20.09.2013, 14:04. Показов 1282. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть переменная типа 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?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2013, 14:04
Ответы с готовыми решениями:

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std;...

Преобразование к double
Как сделать чтобы ответ был типа (DOUBLE)? #include <iostream> #include <string> #include...

Преобразование string в double
У меня есть массив типа string, в котором хранятся нецелые числа. Надо отсортировать массив по...

Преобразование string в double
Как преобразовать string в double?

18
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2013, 14:15 2
C++
1
seconds + fraction/1000.
или какие там у Вас доли.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.09.2013, 14:17 3
Какая доля? Десятая? Сотая? Тысячная?
1
Tulosba
20.09.2013, 14:20
  #4

Не по теме:

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

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

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

Мозги отказываются думать.. По-моему так.
1
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 5
20.09.2013, 15:27  [ТС] 9
Спасибо, похоже на правду
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2013, 15:28 10
castaway, есть еще modf() для этих целей.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.09.2013, 15:45 11
Это не тот случай чтобы прибегать к modf, к тому же он более ресурсоемок.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2013, 16:47 12
Цитата Сообщение от castaway Посмотреть сообщение
Это не тот случай чтобы прибегать к modf
Почему не тот? Задача извлечь целую и дробную части. Прям как в описании функции.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.09.2013, 17:39 13
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему не тот?
Потому что это можно сделать намного быстрее не используя fmod, т.к. размер целой и дробной части нам известен.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2013, 18:01 14
Цитата Сообщение от castaway Посмотреть сообщение
Потому что это можно сделать намного быстрее
Небольшой тестик http://ideone.com/ZHbltS
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.09.2013, 18:53 15
Tulosba, спасибо. Но можешь поставить тип для fractpart и intpart как целочисленный в моем случае?
А я пока еще на код посмотрю, если ты не против
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.09.2013, 14:01 16
castaway, так можно было и самому форкнуть http://ideone.com/rRG6Hq
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.09.2013, 14:03 17
Да я уже зарегился там, проверил и правда, modf почему-то работает быстрее. Я над этим до сих пор думаю)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.09.2013, 14:42 18
Цитата Сообщение от castaway Посмотреть сообщение
Да я уже зарегился там
регаться, кстати, необязательно.
Цитата Сообщение от castaway Посмотреть сообщение
modf почему-то работает быстрее
Функции стандартной библиотеки жутко оптимизированные. Чтобы понять причины надо в исходники libm какой-нибудь смотреть.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.09.2013, 16:35 19
Цитата Сообщение от Tulosba Посмотреть сообщение
Функции стандартной библиотеки жутко оптимизированные.
Если честно, то не так уж и жутко.
Цитата Сообщение от Tulosba Посмотреть сообщение
Чтобы понять причины надо в исходники libm какой-нибудь смотреть.
Да, я покопал. В общем набросал небольшой тест: http://ideone.com/lUBX1A
modf действительно быстрее floor, видимо потому, что floor сама по себе более сложнее, а может быть frndint (используемая в floor) просто медленнее fprem, которая используется в modf.

В примере родные функции медленнее, из-за того что в них обрабатываются всевозможное ошибки и исключительные ситуации.
0
21.09.2013, 16:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2013, 16:35
Помогаю со студенческими работами здесь

Преобразование из double в строку
Здравствуйте, в общем такое дело, есть winapi приложение с подключаемой .dll, при подсчёте функция...

Преобразование void в double
Пример кода: glutDisplayFunc(RenderScene); // функция которая принимает в виде аргумента void...

Преобразование строки в double
Собственно есть код: #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; double...

Преобразование double в string
Нужно преобразовать double в строку. Знаю про функции ostringstream и stod(), но их проблема в том,...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru