separate ( Generic_Elementary_Functions ) function Sin( X : Float_Type ) return Float_Type is -- On input, X is a floating-point value in Float_Type; -- On output, the value of sin(X) (the sine of X) is returned. Y, R1, R2, Sign_Y, Z : Common_Float; I_Flag, SC_Flag, PM_Flag : Quadrant_Flag; Large_Threshold : constant Common_Float := Common_Float(Radix)**(Float_Type'Machine_Mantissa/2); Two_Pi : constant Common_Float := 6.28318_53071_79586_47692_52867_66559_00576_83943_38798_75016; begin -- Argument reduction by KP_Pi2Rd if ( X = 0.0 ) then return( X ); end if; Y := Common_Float( X ); if ( abs(Y) > Large_Threshold ) then Y := Y rem Two_Pi; end if; if (Y >= 0.0) then Sign_Y := 1.0; else Sign_Y := -1.0; Y := abs(Y); end if; KP_Pi2Rd( Y, R1, R2, I_Flag ); SC_Flag := I_Flag mod 2; PM_Flag := (I_Flag - SC_Flag) / 2; if (SC_Flag = 0) then Z := KF_Sin( R1, R2 ); else Z := KF_Cos( R1, R2 ); end if; if (PM_Flag = 1) then Z := -Z; end if; return( Float_Type( Sign_Y * Z ) ); end Sin;