Является ли int-> double-> int гарантированным сохранение ценности?
Если у меня есть int
, преобразуйте его в double
, а затем преобразуйте double
обратно в int
, мне гарантировано получить то же самое значение, с которого я начал? Другими словами, учитывая эту функцию:
int passThroughDouble(int input)
{
double d = input;
return d;
}
Я гарантировал, что passThroughDouble(x) == x
для всех int
x
?
Ответы
Ответ 1
Нет, это не так. В стандарте ничего не говорится об относительных размерах int
и double
.
Если int
- это 64-разрядное целое число, а double
- стандартная двойная точность IEEE, то он будет терпеть неудачу для чисел, больших 2^53
.
Тем не менее, int
по-прежнему 32-бит в большинстве средах сегодня. Таким образом, он будет сохраняться во многих случаях.
Ответ 2
Если мы ограничимся рассмотрением "традиционного" представления типов с плавающей точкой в стиле IEEE-754, вы можете ожидать, что это преобразование будет сохраняться в значениях тогда и только тогда, когда мантисса типа double
имеет столько же биты, поскольку в типе int
есть не знаковые биты.
Мантисса классического типа IEEE-754 double
имеет ширину 53 бит (включая "подразумеваемый" ведущий бит), что означает, что вы можете точно представлять целые числа в диапазоне [-2^53, +2^53]
. Все, что из этого диапазона, как правило, теряет точность.
Итак, все зависит от того, насколько широкий ваш int
сравнивается с вашим double
. Ответ зависит от конкретной платформы. С 32-разрядным int
и IEEE-754 double
должно выполняться равенство.