| -- { dg-do compile } |
| -- { dg-options "-O3" } |
| |
| with Opt18_Pkg; use Opt18_Pkg; |
| |
| package body Opt18 is |
| |
| function Mag (Item : in Cart_Vector_Type) return Float is |
| begin |
| return Sqrt (Item (X) * Item (X) + Item (Y) * Item (Y) |
| + Item (Z) * Item (Z)); |
| end; |
| |
| function Unit_Quaternion_To_Mag_Axis (Quaternion : in Unit_Quaternion_Type) |
| return Mag_Axis_Type is |
| Sin_Half : Float |
| := Mag (Cart_Vector_Type'(Quaternion.X, Quaternion.Y, Quaternion.Z)); |
| begin |
| if Sin_Half > 3.0 * First_Order_Trig then |
| return |
| (Mag => Atan2 (Double_Trig (Unchecked_Trig_Pair (Sin_Half, |
| Quaternion.S))), |
| Axis => Unit_Vector_Type'(Quaternion.X / Sin_Half, |
| Quaternion.Y / Sin_Half, |
| Quaternion.Z / Sin_Half)); |
| else |
| return (0.0, X_Unit); |
| end if; |
| end; |
| |
| end Opt18; |