Когда константа с плавающей точкой переполняется, если она неявно преобразуется в тип int - PullRequest
0 голосов
/ 07 июня 2019

У меня есть два фрагмента кода, и оба дают разные результаты. Я использую компилятор TDM-GCC 4.9.2, и мой компилятор является 32-битной версией

(размер int равен 4 байта, а минимальное значение в float равно -3.4e38)

Код 1:

int x;
x=2.999999999999999; // 15 '9s' after decimal point
printf("%d",x);

Выход:

2

Код 2:

int x;
x=2.9999999999999999; // 16 '9s' after decimal point
printf("%d",x);

Выход:

3

Почему неявное преобразование отличается в этих случаях?

Это происходит из-за некоторого переполнения указанной действительной константы, и если да, то как это происходит?

1 Ответ

5 голосов
/ 07 июня 2019

(Ограничение этого ответа IEEE754).

Когда вы присваиваете константу с плавающей запятой, стандарт IEEE754 требует, чтобы было выбрано ближайшее возможное число с плавающей запятой.Оба числа, которые вы представляете, не могут быть представлены точно.

Ближайшее число с плавающей точкой двойной точности IEEE754 к 2.999999999999999 равно 2.99999999999999911182158029987476766109466552734375, тогда как ближайшее к 2.9999999999999999 является 3.

Отсюда вывод.Преобразование в целочисленный тип усекает значение до нуля.

Использование round - один из способов устранить этот эффект.

Дополнительная информация: Не работает ли математика с плавающей запятой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...