Я пишу функцию, которая влияет на ощущение элемента управления, и обнаружил, что деление на 15,9 было правильным. Мой естественный инстинкт состоит в том, чтобы изменить это на деление на 16, потому что это может быть оптимизировано компилятором для операции сдвига. Однако в этом случае значение является плавающим. Существуют ли оптимальные делители в вещественном делении?
Оптимальное деление компилятора для float
Ответы (2)
Разделить число с плавающей запятой на 16 тоже довольно просто. Вам просто нужно уменьшить показатель степени на 4. Но я не думаю, что компилятор делает здесь какую-либо оптимизацию, потому что тогда ему также пришлось бы проверять наличие потери значимости.
Чтобы было ясно: я не предлагаю напрямую манипулировать битами экспоненты. Я просто хотел указать, что потенциально самые быстрые делители для float
также являются степенями двойки.
Почему бы вместо этого не умножить на 0,0628930818? Если деление на 15,9 «примерно правильно», то умножение на обратное, хотя, возможно, и не совсем точное до последнего десятичного знака, все равно будет «примерно правильным». Оптимизирующий компилятор может даже сделать это автоматически, если используются некоторые "разрешающие математические" флаги (обычно это категорически недопустимо, так как это может привести к некоторой потере точности).
В любом случае, это точнее, чем деление на 16. И это не столько хак, сколько подделка битов экспоненты.