Я следую Это видеоурок по реализации raycaster. Он содержит этот код:
if(ra > PI) { ry = (((int)py>>6)<<6)-0.0001; rx=(py-ry)*aTan+px; yo=-64; xo=-yo*aTan; }//looking up
Я надеюсь, что я расшифровал это правильно. В частности, мой вопрос о приведении py
(он объявлен как float
) к целому числу, смещении его назад и вперед, вычитании чего-либо, а затем присвоении его ry
(также float
) этой строке код вводится в 7:24, где он также объясняет, что он хочет
округлить позицию y до ближайшего 64-го значения
(я не уверен, если это означает, что ближайшее кратное 64 или ближайшее (1/64), но я знаю, что 6 в источнике происходит от числа 64, равного 2⁶)
С одной стороны, я думаю, что это будет допустимо, чтобы компилятор загружал (скажем) 32-разрядное число с плавающей запятой в регистр машины, а затем сдвигал это значение на шесть пробелов, а затем сдвигал его обратно на шесть пробелов (эти две операции могут мешать мантиссе, или показатель степени, или, может быть, что-то еще, или , эти две операции могут быть удалены с помощью шага оптимизации глазка.)
Также я думаю, что для компилятора будет правильным, чтобы демоны вылетали из Ваш нос, когда выполняется это утверждение.
Итак, мой вопрос: (((int)py>>6)<<6)
определено в C, когда py
равно float
?