Книга, кажется, предполагает, что cr1 != 0
всегда верно. Но, к сожалению, это не всегда так (когда угол поворота равен PI / 2).
Я не думаю, что вы можете решить эту проблему, регулируя коэффициенты твида. Единственный вариант, который я вижу, это использовать какое-то очень маленькое число вместо нуля. Это может сработать, но это некрасиво и в некоторых случаях может привести к неточностям.
Возможные решения:
- Разделите l oop на две части и обработайте этот центральный регистр ( где происходит деление на ноль) специально
- Вместо деления на
cr1
, делим на ci1
и соответствующим образом модифицируем форум. В этом случае все еще есть деление на ноль, но это произойдет на первой итерации l oop. Таким образом, вместо центра вы должны обрабатывать первую итерацию специально (поэтому требуется только одна l oop). - Используйте другую формулировку FMA:
Обратите внимание, что :
zoutr(1) = u0 - u1
= u0 - u1 - (u0 + u1) + (u0 + u1)
= u0 - u1 - zoutr(0) + u0 + u1
= 2*u0 - zoutr(0)
Итак, эту операцию можно выполнить в 1 FMA.
И если подставить u1
в выражение zoutr(0)
:
zoutr(0) = u0 + u1
= u0 + r*cr1 - s*ci1
Это может быть сделано с 2 FMA.
Расчет zouti
может быть выполнен так же, как zoutr
. Таким образом, вам нужно использовать 6 операций FMA, то есть столько же операций, сколько в книге.
(Обратите внимание, это не означает, что этот вариант будет работать быстрее автоматически, так как он имеет другой цепочка зависимостей данных)