Младшие значащие биты целого числа, потерянного во время преобразования в тип с плавающей точкой
Этот дефект происходит, когда вы бросаете целочисленное значение к типу с плавающей точкой, который не может представлять исходное целочисленное значение.
Например, long int
значение 1234567890L
является слишком большим для переменной типа float
.
Если тип с плавающей точкой не может представлять целочисленное значение, поведение не определено (см. стандарт C11, 6.3.1.4, абзац 2). Например, младшие значащие биты значения переменных могут быть пропущены, ведя к неожиданным результатам.
Преобразуйте в тип с плавающей точкой, который может представлять целочисленное значение.
Например, если float
тип данных не может представлять целочисленное значение, использовать double
тип данных вместо этого.
Когда запись функции, которая преобразует целое число в тип с плавающей точкой перед преобразованием, проверяет, может ли целочисленное значение быть представлено в типе с плавающей точкой. Например, DBL_MANT_DIG * log2(FLT_RADIX)
представляет количество основы 2 цифры в типе double
. Перед преобразованием в тип double
, проверяйте, больше ли этот номер или равен с точностью целого числа, которое вы преобразуете. Определить точность целочисленного num
, используйте этот код:
size_t precision = 0; while (num != 0) { if (num % 2 == 1) { precision++; } num >>= 1; }
Некоторые реализации обеспечивают встроенную функцию, чтобы определить точность целого числа. Например, GCC обеспечивает функциональный __builtin_popcount
.
Группа: числовой |
Язык: C | C++ |
Значение по умолчанию: 'off' |
Синтаксис командной строки:
INT_TO_FLOAT_PRECISION_LOSS |
Удар: низко |
ID CWE: 189, 681, 704 |