@timkin1

Можно ли число представить в виде float?

Здравствуйте!
Как можно проверить представимость беззнакового числа в виде float?

Заранее спасибо!
  • Вопрос задан
  • 670 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
представимость беззнакового числа в виде float

Целого? Стандартного типа (int/long/...) или просто последовательности цифр?
Простейший вариант:
bool is_representable_as_float(unsigned v)
{
    return v == (unsigned)(float)v;
}
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Float содержит 23 бита мантиссы и неявную единицу. Порядок float запредельный и даже qword не упрётся в него.
Это значит: всё, что дальше 23 бит от верхней единицы, должно быть нулём.

bool isPreciseFloat(unsigned long long n)
{
  // Простейшая проверка: стираем нижние 24 бита
  // Если в них вписываемся — ДА.
  unsigned long long n1 = n & ~((1ULL << 24) - 1);
  if (n1 == 0)
    return true;

  // Получаем верхнюю единицу
  // (можно также двоичным поиском, но я этого с листа не напишу)
  while (true) {
    unsigned long long n2 = n1 & (n1 - 1);
    if (n2 == 0)
      break;
    n1 = n2;
  }

  // Получаем маску всего, что ниже 23 бит от верхнего бита.
  n1 >>= 23;
  --n1;

  // Проверяем по маске
  return (n & n1) == 0;
}


Писал «с листа», могут быть ошибки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы