@@ -998,44 +998,51 @@ <h4 style="font-size:160%;margin:7px">Trigonometry</h4>
998998}
999999
10001000function Asin ( x ) {
1001- if ( typeof x !== 'number' || isNaN ( x ) || x <= 0 || x > 1 ) return null ;
1001+ if ( typeof x !== 'number' || isNaN ( x ) || x < 0 || x > 1 ) return null ;
10021002
1003- const isSineZone = x >= 0.707 ;
1004- const sourceFunc = isSineZone ? 'sin' : 'cos' ;
1005-
1006- const match = closestValue ( x , sourceFunc ) ;
1007- if ( ! match ?. angle || typeof match . angle !== 'string' ) {
1008- console . warn ( `Asin: No angle match found for ${ x } in ${ sourceFunc } ` ) ;
1009- return null ;
1010- }
1003+ let radian = null ;
10111004
1012- const parsed = match . angle . match ( / r a d \( ( [ \d . ] + ) \) / ) ;
1013- if ( ! parsed ) {
1014- console . warn ( `Asin: Could not parse radian from "${ match . angle } "` ) ;
1015- return null ;
1016- }
1005+ if ( x > 0.706 ) {
1006+ // Direct match
1007+ const match = closestValue ( x , 'sin' ) ;
1008+ if ( ! match ?. angle ) return null ;
1009+ const parsed = match . angle . match ( / r a d \( ( [ \d . ] + ) \) / ) ;
1010+ if ( ! parsed ) return null ;
1011+ radian = parseFloat ( parsed [ 1 ] ) ;
1012+ } else {
1013+ // Reflective zone
1014+ const match = closestValue ( x , 'cos' ) ;
1015+ if ( ! match ?. angle ) return null ;
1016+ const parsed = match . angle . match ( / r a d \( ( [ \d . ] + ) \) / ) ;
1017+ if ( ! parsed ) return null ;
1018+ radian = parseFloat ( parsed [ 1 ] ) ; }
10171019
1018- const radian = parseFloat ( parsed [ 1 ] ) ;
1019- return isSineZone ? radian : radian ; // no reflection needed
1020+ return radian ;
10201021}
10211022
10221023function Acos ( x ) {
1023- if ( typeof x !== 'number' || x <= 0 || x > 1 ) return null ;
1024+ if ( typeof x !== 'number' || isNaN ( x ) || x < 0 || x > 1 ) return null ;
10241025
1025- if ( x <= 0.707 ) {
1026+ let radian = null ;
1027+
1028+ if ( x < 0.708 ) {
1029+ // Direct match
10261030 const match = closestValue ( x , 'cos' ) ;
1027- const parsed = match ?. angle . match ( / r a d \\ ( ( [ \d . ] + ) \\ ) / ) ;
1031+ if ( ! match ?. angle ) return null ;
1032+ const parsed = match . angle . match ( / r a d \( ( [ \d . ] + ) \) / ) ;
10281033 if ( ! parsed ) return null ;
1029- return parseFloat ( parsed [ 1 ] ) ;
1030- }
1031-
1032- // No reflection — match via cosine
1033- const match = closestValue ( x , 'sin' ) ;
1034- const parsed = match ?. angle . match ( / r a d \\ ( ( [ \d . ] + ) \\ ) / ) ;
1035- if ( ! parsed ) return null ;
1036- return parseFloat ( parsed [ 1 ] ) ;
1037- }
1034+ radian = parseFloat ( parsed [ 1 ] ) ;
1035+ } else {
1036+ // Reflective zone
1037+ const match = closestValue ( x , 'sin' ) ;
1038+ if ( ! match ?. angle ) return null ;
1039+ const parsed = match . angle . match ( / r a d \( ( [ \d . ] + ) \) / ) ;
1040+ if ( ! parsed ) return null ;
1041+ radian = parseFloat ( parsed [ 1 ] ) ; }
10381042
1043+ return radian ;
1044+ }
1045+
10391046function Atan ( x ) {
10401047 if ( typeof x !== 'number' || isNaN ( x ) || x <= 0 ) return null ;
10411048
0 commit comments