Я использую std::hash<std::string>()
для создания хеш-кода для строки на C++. Функция возвращает long double
, но мне нужно uint64_t
по унаследованным причинам.Безопасный лить long double to uint64_t
Является ли такой литой сейф?
Я использую std::hash<std::string>()
для создания хеш-кода для строки на C++. Функция возвращает long double
, но мне нужно uint64_t
по унаследованным причинам.Безопасный лить long double to uint64_t
Является ли такой литой сейф?
C++ Стандартный пункт 3.9.1.8 говорит:
Есть три типа с плавающей точкой: поплавок, двойной и длинный двойной. Тип double обеспечивает как минимум такую же точность, как float, а double double double обеспечивает как минимум такую же точность, как double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией. Интегральные и плавающие типы совместно называются арифметическими типами. Специализации стандартного шаблона std :: numeric_limits (18.3) должны указывать максимальное и минимальное значения каждого арифметического типа для реализации.
Которая в значительной степени только говорит о том, что длинный двойной тип должен быть ... длиннее поплавкового типа.
На практике длинные дважды, как правило, 80- до 128-битную, как описано здесь: http://en.cppreference.com/w/cpp/language/types
Это делает кастинг (я предполагаю reinterpret_cast) к uint64_t небезопасным, так как некоторые биты от длинного двойного, вероятно, не поместиться.
Оператор вызова std::hash
возвращает значение типа size_t
, которое представляет хеш-значение параметра.
Таким образом, предположение о том, что вопрос о возврате long double
, кажется неправильным.
Ух, ты, конечно, прав. Это то, что я получаю от доверия к шаткой IDE, а не за чтением документов. – span
Как это будет? 'long double' - это плавающая запятая,' uint64_t' - целое число. –
Я думаю, вы должны STATIC_ASSERT sizeof (uint64_t) == sizeof (long double) –
Какой тип? – sgarizvi