Урок 18. Паттерн 10. Хранение в double целочисленных значений

24.01.2012

Тип double имеет размер 64 бита, и совместим со стандартом IEEE-754 на 32-битных и 64-битных системах.

Примечание. IEEE 754 — широко распространённый стандарт формата представления числа с плавающей запятой, используемый как в программных реализациях арифметических действий, так и во многих аппаратных (CPU и FPU) реализациях. Многие компиляторы языков программирования используют этот стандарт для хранения и выполнения математических операций.

Некоторые программисты используют тип double для хранения и работы с целочисленными типами:

size_t a = size_t(-1);
double b = a;
--a;
--b;
size_t c = b; // x86: a == c
              // x64: a != c

Данный пример еще можно пытаться оправдать на 32-битной системе, так как тип double имеет 52 значащих бита и способен без потерь хранить 32-битное целое значение. Но при попытке сохранить в double 64-битное целое число точное значение может быть потеряно (см. рисунок 1).

Рисунок 1 - Количество значащих битов в типах size_t и double

Рисунок 1 - Количество значащих битов в типах size_t и double

Возможно, приближенное значение вполне применимо в Вашей программе, но на всякий случай хочется сделать предупреждение о потенциальных эффектах на новой архитектуре. И в любом случае не рекомендуется смешивать целочисленную арифметику и арифметику с плавающей точкой.

Диагностика

Данный паттерн ошибок относится к редко встречающимся на практике. Тем не менее, редко встречающиеся ошибки не менее опасны. Анализатор PVS-Studio предупреждает о потенциально возможной ошибке с помощью диагностического сообщения V113. Если необходимо обнаружить явное приведение типов (от memsize к double и обратно), то можно включить предупреждение V203.

Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).

Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++" является ООО "Системы программной верификации". Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com.

Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.