МОЙ лучший ответ, который я могу придумать, это то, что я могу использовать тождество:
x/3 = sum(n=1 to infinity) (x/2^(2n))
и затем взять первые n членов.Используя 4 термина, я получаю:
(x/4)+(x/16)+(x/64)+(x/256)
, что равно
x*0.33203125
, что, вероятно, достаточно хорошо.
Это зависит от умножения на фиксированную степень 2, являющегося свободнымв аппаратном обеспечении, затем 3 добавления, из которых я могу запустить 2 параллельно.
Любой лучший ответ приветствуется.
** РЕДАКТИРОВАТЬ **: Используя комбинацию этого и ответа @ dyslexicgruffalo Iсделал простую программу на c ++, которая перебирала различные последовательности, пробовал их все и записывал различные средние / максимальные ошибки.
Я сделал это для 0 <= x <= 189 (поскольку 189 - это значение 2 *c0.g + c1.g, когда g (который равен 6 битам) достигает максимума. </p>
Самая короткая правильная последовательность (с максимальной ошибкой 2, средней ошибкой 0,62) и с 4 операциями была:
1 + x/4 + x/16 + x/64.
Наилучшая последовательность с максимальной ошибкой 1, средней ошибкой 0,32, но с 6 операциями была:
x/2 - x/4 + x/8 - x/16 + x/32 - x/64.
Для 5-битовых значений (красного и синего) максимальное значениеравно 31 * 3, и приведенные выше последовательности все еще хороши, но не лучше. Это:
x/4 + x/8 - x/16 + x/32 [max error of 1, average 0.38]
и
1 + x/4 + x/16 [max error of 2, average of 0.68]
(И, к счастью, ни одна из вышеперечисленных последовательностей никогда не угадывает ответ, который является слишком большим, поэтому зажим не требуется, даже если они не идеальны)