2016-08-20 3 views
0

Я недавно заметил некоторый код в рамках, в котором я работаю, с преобразованием некоторых переменных в двойные, а затем обратно, когда к ним обращается инфраструктура. В стандарте C++ 11 гарантируется ли работа без потери точности для любых интегральных типов? Если да, то какой? Существуют ли какие-либо дополнительные типы, которые являются универсальными для такого преобразования в общих реализациях?Преобразование типов без потери точности

Кроме того, есть ли способ проверить во время компиляции, что преобразование безопасно таким образом? По сути, я хотел бы что-то вроде:

static_assert(T(double(T type))==type); 
+0

Какие типы вы используете в своем коде? Есть ли причина, по которой вы не используете 'double' для начала, чтобы избежать этих преобразований? –

+0

@ Code-Apprentice Типы устанавливаются каркасом (т. Е. Я не могу их изменить). Например, 'm_type' является' unsigned int' внутри, но когда он обращается через фрейм, он преобразуется в 'double'. – Chris

+0

@ Code-Apprentice Кроме того, я преобразовываю их обратно в исходный тип, чтобы сэкономить место. Я потом их сериализую, и даже с этим преобразованием он все еще занимает около терабайта, поэтому оптимизация на этом уровне очень важна. – Chris

ответ

2

T(double(T_value))==T_value гарантируются, когда диапазон интегрального типа T является поддиапазоном диапазона точных интегральных значений типа double.

Поскольку ни реализация double не имеет 16 бит или меньше для мантиссы, и с тех пор, насколько я знаю, нет сохранившегося C реализации ++ с более чем 16 битами на байты (CHAR_BIT неизменных из <limits.h>), эта гарантии имеет место для char и и явно варианты signed и unsigned.

Как правило, double имеет около 50+ бит мантиссы, и этого достаточно для гарантии удержания также для 32-битных интегральных типов, но не для 64-битных.

0

Ну, я (в основном) выяснили, вторую часть моего вопроса:

#include <limits> 
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE."); 
Смежные вопросы