\left(\sin \left(\left(1 - u\right) \cdot normAngle\right) \cdot \frac{1}{\sin normAngle}\right) \cdot n0_i + \left(\sin \left(u \cdot normAngle\right) \cdot \frac{1}{\sin normAngle}\right) \cdot n1_i
\begin{array}{l}
t_0 := {normAngle}^{4} \cdot \left(0.08333333333333333 \cdot \left(u \cdot u\right)\right)\\
t_1 := u \cdot \left(n0_i \cdot {normAngle}^{4}\right)\\
t_2 := u \cdot \left(n0_i \cdot {normAngle}^{6}\right)\\
t_3 := u \cdot \left(normAngle \cdot normAngle\right)\\
\left(\left(\left(\left(n0_i + \left(\left(\left(0.09166666666666666 \cdot t_1 + n0_i \cdot \left(0.16666666666666666 \cdot \left({u}^{3} \cdot \left(normAngle \cdot normAngle\right)\right) + \left({normAngle}^{6} \cdot {u}^{5}\right) \cdot 0.002777777777777778\right)\right) + t_2 \cdot \left(0.016666666666666666 + u \cdot 0.013888888888888888\right)\right) + n0_i \cdot \left(\left(normAngle \cdot normAngle\right) \cdot \left(u \cdot 0.5\right) + t_0\right)\right)\right) + n0_i \cdot \left(0.0001984126984126984 \cdot \left({normAngle}^{6} \cdot {u}^{7}\right) + 0.041666666666666664 \cdot \left({normAngle}^{4} \cdot {u}^{4}\right)\right)\right) + {u}^{3} \cdot \left({normAngle}^{6} \cdot \left(n0_i \cdot 0.004629629629629629\right) + {normAngle}^{4} \cdot \left(n0_i \cdot 0.027777777777777776\right)\right)\right) - \left(\left(\left(\left(\left(t_1 \cdot 0.06944444444444445 + t_2 \cdot \left(u \cdot 0.013888888888888888 + 0.01455026455026455\right)\right) + u \cdot \left(n0_i + \left(n0_i \cdot 0.5\right) \cdot t_3\right)\right) + n0_i \cdot \left(t_0 + 0.16666666666666666 \cdot t_3\right)\right) + {u}^{3} \cdot \left({normAngle}^{6} \cdot \left(n0_i \cdot 0.008333333333333333\right) + {normAngle}^{4} \cdot \left(n0_i \cdot 0.08333333333333333\right)\right)\right) + n0_i \cdot \left(0.008333333333333333 \cdot \left({normAngle}^{4} \cdot {u}^{5}\right) + 0.001388888888888889 \cdot \left({normAngle}^{6} \cdot {u}^{6}\right)\right)\right)\right) + n1_i \cdot \left(\left(\left(u + {normAngle}^{4} \cdot \left({u}^{5} \cdot 0.008333333333333333 + u \cdot 0.019444444444444445\right)\right) + \left(0.16666666666666666 \cdot \left(normAngle \cdot normAngle\right)\right) \cdot \left(u - {u}^{3}\right)\right) + {normAngle}^{4} \cdot \left({u}^{3} \cdot -0.027777777777777776\right)\right)
\end{array}
(FPCore (normAngle u n0_i n1_i) :precision binary32 (+ (* (* (sin (* (- 1.0 u) normAngle)) (/ 1.0 (sin normAngle))) n0_i) (* (* (sin (* u normAngle)) (/ 1.0 (sin normAngle))) n1_i)))
(FPCore (normAngle u n0_i n1_i)
:precision binary32
(let* ((t_0 (* (pow normAngle 4.0) (* 0.08333333333333333 (* u u))))
(t_1 (* u (* n0_i (pow normAngle 4.0))))
(t_2 (* u (* n0_i (pow normAngle 6.0))))
(t_3 (* u (* normAngle normAngle))))
(+
(-
(+
(+
(+
n0_i
(+
(+
(+
(* 0.09166666666666666 t_1)
(*
n0_i
(+
(* 0.16666666666666666 (* (pow u 3.0) (* normAngle normAngle)))
(* (* (pow normAngle 6.0) (pow u 5.0)) 0.002777777777777778))))
(* t_2 (+ 0.016666666666666666 (* u 0.013888888888888888))))
(* n0_i (+ (* (* normAngle normAngle) (* u 0.5)) t_0))))
(*
n0_i
(+
(* 0.0001984126984126984 (* (pow normAngle 6.0) (pow u 7.0)))
(* 0.041666666666666664 (* (pow normAngle 4.0) (pow u 4.0))))))
(*
(pow u 3.0)
(+
(* (pow normAngle 6.0) (* n0_i 0.004629629629629629))
(* (pow normAngle 4.0) (* n0_i 0.027777777777777776)))))
(+
(+
(+
(+
(+
(* t_1 0.06944444444444445)
(* t_2 (+ (* u 0.013888888888888888) 0.01455026455026455)))
(* u (+ n0_i (* (* n0_i 0.5) t_3))))
(* n0_i (+ t_0 (* 0.16666666666666666 t_3))))
(*
(pow u 3.0)
(+
(* (pow normAngle 6.0) (* n0_i 0.008333333333333333))
(* (pow normAngle 4.0) (* n0_i 0.08333333333333333)))))
(*
n0_i
(+
(* 0.008333333333333333 (* (pow normAngle 4.0) (pow u 5.0)))
(* 0.001388888888888889 (* (pow normAngle 6.0) (pow u 6.0)))))))
(*
n1_i
(+
(+
(+
u
(*
(pow normAngle 4.0)
(+ (* (pow u 5.0) 0.008333333333333333) (* u 0.019444444444444445))))
(* (* 0.16666666666666666 (* normAngle normAngle)) (- u (pow u 3.0))))
(* (pow normAngle 4.0) (* (pow u 3.0) -0.027777777777777776)))))))float code(float normAngle, float u, float n0_i, float n1_i) {
return ((sinf((1.0f - u) * normAngle) * (1.0f / sinf(normAngle))) * n0_i) + ((sinf(u * normAngle) * (1.0f / sinf(normAngle))) * n1_i);
}
float code(float normAngle, float u, float n0_i, float n1_i) {
float t_0 = powf(normAngle, 4.0f) * (0.08333333333333333f * (u * u));
float t_1 = u * (n0_i * powf(normAngle, 4.0f));
float t_2 = u * (n0_i * powf(normAngle, 6.0f));
float t_3 = u * (normAngle * normAngle);
return ((((n0_i + ((((0.09166666666666666f * t_1) + (n0_i * ((0.16666666666666666f * (powf(u, 3.0f) * (normAngle * normAngle))) + ((powf(normAngle, 6.0f) * powf(u, 5.0f)) * 0.002777777777777778f)))) + (t_2 * (0.016666666666666666f + (u * 0.013888888888888888f)))) + (n0_i * (((normAngle * normAngle) * (u * 0.5f)) + t_0)))) + (n0_i * ((0.0001984126984126984f * (powf(normAngle, 6.0f) * powf(u, 7.0f))) + (0.041666666666666664f * (powf(normAngle, 4.0f) * powf(u, 4.0f)))))) + (powf(u, 3.0f) * ((powf(normAngle, 6.0f) * (n0_i * 0.004629629629629629f)) + (powf(normAngle, 4.0f) * (n0_i * 0.027777777777777776f))))) - ((((((t_1 * 0.06944444444444445f) + (t_2 * ((u * 0.013888888888888888f) + 0.01455026455026455f))) + (u * (n0_i + ((n0_i * 0.5f) * t_3)))) + (n0_i * (t_0 + (0.16666666666666666f * t_3)))) + (powf(u, 3.0f) * ((powf(normAngle, 6.0f) * (n0_i * 0.008333333333333333f)) + (powf(normAngle, 4.0f) * (n0_i * 0.08333333333333333f))))) + (n0_i * ((0.008333333333333333f * (powf(normAngle, 4.0f) * powf(u, 5.0f))) + (0.001388888888888889f * (powf(normAngle, 6.0f) * powf(u, 6.0f))))))) + (n1_i * (((u + (powf(normAngle, 4.0f) * ((powf(u, 5.0f) * 0.008333333333333333f) + (u * 0.019444444444444445f)))) + ((0.16666666666666666f * (normAngle * normAngle)) * (u - powf(u, 3.0f)))) + (powf(normAngle, 4.0f) * (powf(u, 3.0f) * -0.027777777777777776f))));
}



Bits error versus normAngle



Bits error versus u



Bits error versus n0_i



Bits error versus n1_i
Results
Initial program 0.9
Taylor expanded in normAngle around 0 0.7
Simplified0.6
Taylor expanded in normAngle around 0 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2021206
(FPCore (normAngle u n0_i n1_i)
:name "Curve intersection, scale width based on ribbon orientation"
:precision binary32
:pre (and (<= 0.0 normAngle (/ PI 2.0)) (<= -1.0 n0_i 1.0) (<= -1.0 n1_i 1.0) (<= 2.328306437e-10 u 1.0))
(+ (* (* (sin (* (- 1.0 u) normAngle)) (/ 1.0 (sin normAngle))) n0_i) (* (* (sin (* u normAngle)) (/ 1.0 (sin normAngle))) n1_i)))