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

retweet
25.03.2010 13:00


Тип 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).

http://www.viva64.com/lessons-x64/content/pics/18-01.png

Рисунок 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.