@@ -343,8 +343,7 @@ export namespace NativeMath {
343343 t = reinterpret < f64 > ( ( reinterpret < u64 > ( t ) + 0x80000000 ) & 0xFFFFFFFFC0000000 ) ;
344344 var s = t * t ;
345345 r = x / s ;
346- var w = t + t ;
347- r = ( r - t ) / ( w + r ) ;
346+ r = ( r - t ) / ( 2 * t + r ) ;
348347 t = t + t * r ;
349348 return t ;
350349 }
@@ -402,10 +401,7 @@ export namespace NativeMath {
402401 hx &= 0x7FFFFFFF ;
403402 if ( hx >= 0x4086232B ) {
404403 if ( isNaN ( x ) ) return x ;
405- if ( x > overflow ) {
406- x *= Ox1p1023 ;
407- return x ;
408- }
404+ if ( x > overflow ) return x * Ox1p1023 ;
409405 if ( x < underflow ) return 0 ;
410406 }
411407 var hi : f64 , lo : f64 = 0 ;
@@ -819,8 +815,9 @@ export namespace NativeMath {
819815 if ( iy >= 0x43400000 ) yisint = 2 ;
820816 else if ( iy >= 0x3FF00000 ) {
821817 k = ( iy >> 20 ) - 0x3FF ;
822- let offset = select < i32 > ( 52 , 20 , k > 20 ) - k ;
823- let Ly = select < i32 > ( ly , iy , k > 20 ) ;
818+ let kcond = k > 20 ;
819+ let offset = select < i32 > ( 52 , 20 , kcond ) - k ;
820+ let Ly = select < i32 > ( ly , iy , kcond ) ;
824821 let jj = Ly >> offset ;
825822 if ( ( jj << offset ) == Ly ) yisint = 2 - ( jj & 1 ) ;
826823 }
@@ -842,19 +839,24 @@ export namespace NativeMath {
842839 }
843840 var ax = builtin_abs < f64 > ( x ) , z : f64 ;
844841 if ( lx == 0 ) {
845- if ( ix == 0x7FF00000 || ix == 0 || ix == 0x3FF00000 ) {
842+ if ( ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000 ) {
846843 z = ax ;
847844 if ( hy < 0 ) z = 1.0 / z ;
848845 if ( hx < 0 ) {
849- if ( ( ( ix - 0x3FF00000 ) | yisint ) == 0 ) z = ( z - z ) / ( z - z ) ;
850- else if ( yisint == 1 ) z = - z ;
846+ if ( ( ( ix - 0x3FF00000 ) | yisint ) == 0 ) {
847+ let d = z - z ;
848+ z = d / d ;
849+ } else if ( yisint == 1 ) z = - z ;
851850 }
852851 return z ;
853852 }
854853 }
855854 var s = 1.0 ;
856855 if ( hx < 0 ) {
857- if ( yisint == 0 ) return ( x - x ) / ( x - x ) ;
856+ if ( yisint == 0 ) {
857+ let d = x - x ;
858+ return d / d ;
859+ }
858860 if ( yisint == 1 ) s = - 1.0 ;
859861 }
860862 var t1 : f64 , t2 : f64 , p_h : f64 , p_l : f64 , r : f64 , t : f64 , u : f64 , v : f64 , w : f64 ;
@@ -1105,7 +1107,10 @@ export namespace NativeMath {
11051107 var ey = < i64 > ( uy >> 52 & 0x7FF ) ;
11061108 var sx = ux >> 63 ;
11071109 var uy1 = uy << 1 ;
1108- if ( uy1 == 0 || ex == 0x7FF || isNaN < f64 > ( y ) ) return ( x * y ) / ( x * y ) ;
1110+ if ( uy1 == 0 || ex == 0x7FF || isNaN < f64 > ( y ) ) {
1111+ let m = x * y ;
1112+ return m / m ;
1113+ }
11091114 var ux1 = ux << 1 ;
11101115 if ( ux1 <= uy1 ) {
11111116 if ( ux1 == uy1 ) return 0 * x ;
@@ -1157,7 +1162,10 @@ export namespace NativeMath {
11571162 var ex = < i64 > ( ux >> 52 & 0x7FF ) ;
11581163 var ey = < i64 > ( uy >> 52 & 0x7FF ) ;
11591164 var sx = < i32 > ( ux >> 63 ) ;
1160- if ( uy << 1 == 0 || ex == 0x7FF || isNaN ( y ) ) return ( x * y ) / ( x * y ) ;
1165+ if ( uy << 1 == 0 || ex == 0x7FF || isNaN ( y ) ) {
1166+ let m = x * y ;
1167+ return m / m ;
1168+ }
11611169 if ( ux << 1 == 0 ) return x ;
11621170 var uxi = ux ;
11631171 if ( ! ex ) {
@@ -1236,7 +1244,7 @@ function expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)
12361244 const // see: musl/src/math/__expo2f.c
12371245 k = < u32 > 235 ,
12381246 kln2 = reinterpret < f32 > ( 0x4322E3BC ) ; // 0x1.45c778p+7f
1239- var scale = reinterpret < f32 > ( < u32 > ( 0x7F + k / 2 ) << 23 ) ;
1247+ var scale = reinterpret < f32 > ( < u32 > ( 0x7F + ( k >> 1 ) ) << 23 ) ;
12401248 return NativeMathf . exp ( x - kln2 ) * scale * scale ;
12411249}
12421250
@@ -1424,7 +1432,7 @@ export namespace NativeMathf {
14241432 if ( iy == 0 ) {
14251433 switch ( m ) {
14261434 case 0 :
1427- case 1 : return y ;
1435+ case 1 : return y ;
14281436 case 2 : return pi ;
14291437 case 3 : return - pi ;
14301438 }
@@ -1538,12 +1546,8 @@ export namespace NativeMathf {
15381546 hx &= 0x7FFFFFFF ;
15391547 if ( hx >= 0x42AEAC50 ) {
15401548 if ( hx >= 0x42B17218 ) {
1541- if ( ! sign_ ) {
1542- x *= Ox1p127f ;
1543- return x ;
1544- } else {
1545- if ( hx >= 0x42CFF1B5 ) return 0 ;
1546- }
1549+ if ( ! sign_ ) return x * Ox1p127f ;
1550+ else if ( hx >= 0x42CFF1B5 ) return 0 ;
15471551 }
15481552 }
15491553 var hi : f32 , lo : f32 ;
@@ -1889,8 +1893,9 @@ export namespace NativeMathf {
18891893 if ( iy >= 0x4B800000 ) yisint = 2 ;
18901894 else if ( iy >= 0x3F800000 ) {
18911895 k = ( iy >> 23 ) - 0x7F ;
1892- j = iy >> ( 23 - k ) ;
1893- if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ) ;
1896+ let ki = 23 - k ;
1897+ j = iy >> ki ;
1898+ if ( ( j << ki ) == iy ) yisint = 2 - ( j & 1 ) ;
18941899 }
18951900 }
18961901 if ( iy == 0x7F800000 ) { // y is +-inf
@@ -1909,14 +1914,20 @@ export namespace NativeMathf {
19091914 z = ax ;
19101915 if ( hy < 0 ) z = 1.0 / z ;
19111916 if ( hx < 0 ) {
1912- if ( ( ( ix - 0x3F800000 ) | yisint ) == 0 ) z = ( z - z ) / ( z - z ) ;
1917+ if ( ( ( ix - 0x3F800000 ) | yisint ) == 0 ) {
1918+ let d = z - z ;
1919+ z = d / d ;
1920+ }
19131921 else if ( yisint == 1 ) z = - z ;
19141922 }
19151923 return z ;
19161924 }
19171925 var sn = < f32 > 1.0 ;
19181926 if ( hx < 0 ) {
1919- if ( yisint == 0 ) return ( x - x ) / ( x - x ) ;
1927+ if ( yisint == 0 ) {
1928+ let d = x - x ;
1929+ return d / d ;
1930+ }
19201931 if ( yisint == 1 ) sn = - 1.0 ;
19211932 }
19221933 var t1 : f32 , t2 : f32 , r : f32 , s : f32 , t : f32 , u : f32 , v : f32 , w : f32 , p_h : f32 , p_l : f32 ;
@@ -2159,7 +2170,10 @@ export namespace NativeMathf {
21592170 var ey = < i32 > ( uy >> 23 & 0xFF ) ;
21602171 var sx = ux & 0x80000000 ;
21612172 var uy1 = uy << 1 ;
2162- if ( uy1 == 0 || ex == 0xFF || isNaN < f32 > ( y ) ) return ( x * y ) / ( x * y ) ;
2173+ if ( uy1 == 0 || ex == 0xFF || isNaN < f32 > ( y ) ) {
2174+ let m = x * y ;
2175+ return m / m ;
2176+ }
21632177 var ux1 = ux << 1 ;
21642178 if ( ux1 <= uy1 ) {
21652179 if ( ux1 == uy1 ) return 0 * x ;
@@ -2380,3 +2394,27 @@ export function ipow64(x: i64, e: i32): i64 {
23802394 }
23812395 return out ;
23822396}
2397+
2398+ export function ipow32f ( x : f32 , e : i32 ) : f32 {
2399+ var sign = e >> 31 ;
2400+ e = ( e + sign ) ^ sign ; // abs(e)
2401+ var out : f32 = 1 ;
2402+ while ( e ) {
2403+ out *= select < f32 > ( x , 1.0 , e & 1 ) ;
2404+ e >>= 1 ;
2405+ x *= x ;
2406+ }
2407+ return sign ? < f32 > 1.0 / out : out ;
2408+ }
2409+
2410+ export function ipow64f ( x : f64 , e : i32 ) : f64 {
2411+ var sign = e >> 31 ;
2412+ e = ( e + sign ) ^ sign ; // abs(e)
2413+ var out = 1.0 ;
2414+ while ( e ) {
2415+ out *= select ( x , 1.0 , e & 1 ) ;
2416+ e >>= 1 ;
2417+ x *= x ;
2418+ }
2419+ return sign ? 1.0 / out : out ;
2420+ }
0 commit comments