daily pastebin goal
74%
SHARE
TWEET

Defence

a guest Sep 14th, 2018 54 in 297 days
Upgrade to PRO!
ENDING IN00days00hours00mins00secs
  1. DEFENCE.    
  2.     Для решения задачи достаточно сравнивать разницу позиций старшего и младшего единичного бита с числом 23. Если разность не превосходит этого числа, то проверяемое число точно представимо в значении типа 'float'.
  3.     Это равносильно сравнению числа, полученного отсечением младших нулевых битов (если они есть), следующих за младшим единичным битом, с числом 2^24 - 1 или с 2^24 (для простоты вычисления использовался последний вариант). Если проверяемое число не превосходит 2^24, то число представимо в значении типа 'float'.
  4.     Разбор выражения:
  5. return !a ||  a / (a ^ (a & (a - 1))) <= 1 << EXP;
  6. 1) !a - если a = 0, то a - представимо в float
  7. 2) a & (a - 1) - обнуляет младший единичный бит в числе
  8. 3) a ^ (a & (a - 1)) - выделяет младший единичный бит в числе
  9. 4) a / (a ^ (a & (a - 1))) - "отсекает" от числа все нули после младшего единичного бита, если они есть. Если их нет, то согласно пункту 2 исходное число поделится на единицу.
  10. 5) 1 << EXP - создаем вспомогательное число, равное 2^24
  11. 6) a / (a ^ (a & (a - 1))) <= 1 << EXP - проверяемое число с "отсеченными" в пункте 4 нулями после младшего единичного бита сравнивается с числом, полученным в пункте 5. Если левый операнд не превосходит правого, то число точно представимо в float, и функция возвращает 1.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top