Младшие значащие биты целого числа, потерянного во время преобразования в тип с плавающей точкой
Потеря точности от целого числа, чтобы пустить в ход преобразование происходит, когда вы бросаете целочисленное значение к типу с плавающей точкой, который не может представлять исходное целочисленное значение.
Например, значение 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 |