Подтвердить что ты не робот

Является ли int-> double-> int гарантированным сохранение ценности?

Если у меня есть int, преобразуйте его в double, а затем преобразуйте double обратно в int, мне гарантировано получить то же самое значение, с которого я начал? Другими словами, учитывая эту функцию:

int passThroughDouble(int input)
{
  double d = input;
  return d;
}

Я гарантировал, что passThroughDouble(x) == x для всех int x?

4b9b3361

Ответ 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 должно выполняться равенство.