Есть ли случай, когда целое число теряет свою точность при двойном литье?

Предположим, что у меня есть

int i=25; double j=(double)i; 

Есть ли шанс, что j будет иметь значения 24.9999999..upto_allowed или 25.00000000..._upto_allowed_minus_one_and_then_1 . Я помню, как я читал такие вещи, но не мог правильно вспомнить.

Другими словами:

Есть ли случай, когда целое число теряет свою точность при двойном литье?

Для небольших чисел, таких как 25 , вы хороши. Для очень больших (абсолютных) значений int s на архитектуре, где int – 64-разрядный (имеющий значение, не представимое в 53 бит) или более, вы потеряете точность.

Число с плавающей запятой с двойной точностью имеет 53 бита точности, из которых наиболее значимый бит (неявно) обычно равен 1 .

На платформах, где представление с плавающей точкой не является IEEE-754, ответ может быть немного другим. Для получения дополнительной информации вы можете обратиться к разделу 5.2.4.2.2 спецификаций C99 / C11

double IEEE-754 имеет значительную точность 53 бит. Это означает, что он может хранить все знаковые целые числа в диапазоне 2 ^ 53 и -2 ^ 53.

Плавающая точка IEEE 754

Поскольку int обычно имеет 32 бита в большинстве компиляторов / архитектур, double обычно может обрабатывать int .

Ответ @Mohit Jain хорош для практического кодирования.

По спецификациям C важны значения DBL_DIG или FLT_RADIX/DBL_MANT_DIG и INT_MAX/INT_MIN .

DBL_DIG в максимальных десятичных цифрах, число которых может иметь, что при преобразовании в double и обратно обязательно будет иметь такое же значение. Это не менее 10. Таким образом, целое число, например 9999999999, безусловно, может превратиться в double и обратно, не теряя точности. Возможные большие значения могут также успешно округлить.

Реальная проблема с +/-power(FLT_RADIX, DBL_MANT_DIG) начинается с целых значений, превышающих +/-power(FLT_RADIX, DBL_MANT_DIG) . FLT_RADIX – это база с плавающей запятой (и в подавляющем большинстве – 2 ), а DBL_MANT_DIG – это «число FLT_RADIX чисел FLT_RADIX в FLT_RADIX с плавающей запятой», например 53 с бинарным кодом IEEE-754.

Конечно, int имеет диапазон [INT_MIN ... INT_MAX] . Диапазон должен быть не менее [-32767 … + 32,767].

Когда, математически, power(FLT_RADIX, DBL_MANT_DIG) >= INT_MAX , нет проблем с преобразованием. Это относится ко всем соответствующим компиляторам C.