@@ -343,8 +343,7 @@ export namespace NativeMath {
343
343
t = reinterpret < f64 > ( ( reinterpret < u64 > ( t ) + 0x80000000 ) & 0xFFFFFFFFC0000000 ) ;
344
344
var s = t * t ;
345
345
r = x / s ;
346
- var w = t + t ;
347
- r = ( r - t ) / ( w + r ) ;
346
+ r = ( r - t ) / ( 2 * t + r ) ;
348
347
t = t + t * r ;
349
348
return t ;
350
349
}
@@ -402,10 +401,7 @@ export namespace NativeMath {
402
401
hx &= 0x7FFFFFFF ;
403
402
if ( hx >= 0x4086232B ) {
404
403
if ( isNaN ( x ) ) return x ;
405
- if ( x > overflow ) {
406
- x *= Ox1p1023 ;
407
- return x ;
408
- }
404
+ if ( x > overflow ) return x * Ox1p1023 ;
409
405
if ( x < underflow ) return 0 ;
410
406
}
411
407
var hi : f64 , lo : f64 = 0 ;
@@ -819,8 +815,9 @@ export namespace NativeMath {
819
815
if ( iy >= 0x43400000 ) yisint = 2 ;
820
816
else if ( iy >= 0x3FF00000 ) {
821
817
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 ) ;
824
821
let jj = Ly >> offset ;
825
822
if ( ( jj << offset ) == Ly ) yisint = 2 - ( jj & 1 ) ;
826
823
}
@@ -842,19 +839,24 @@ export namespace NativeMath {
842
839
}
843
840
var ax = builtin_abs < f64 > ( x ) , z : f64 ;
844
841
if ( lx == 0 ) {
845
- if ( ix == 0x7FF00000 || ix == 0 || ix == 0x3FF00000 ) {
842
+ if ( ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000 ) {
846
843
z = ax ;
847
844
if ( hy < 0 ) z = 1.0 / z ;
848
845
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 ;
851
850
}
852
851
return z ;
853
852
}
854
853
}
855
854
var s = 1.0 ;
856
855
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
+ }
858
860
if ( yisint == 1 ) s = - 1.0 ;
859
861
}
860
862
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 {
1105
1107
var ey = < i64 > ( uy >> 52 & 0x7FF ) ;
1106
1108
var sx = ux >> 63 ;
1107
1109
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
+ }
1109
1114
var ux1 = ux << 1 ;
1110
1115
if ( ux1 <= uy1 ) {
1111
1116
if ( ux1 == uy1 ) return 0 * x ;
@@ -1157,7 +1162,10 @@ export namespace NativeMath {
1157
1162
var ex = < i64 > ( ux >> 52 & 0x7FF ) ;
1158
1163
var ey = < i64 > ( uy >> 52 & 0x7FF ) ;
1159
1164
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
+ }
1161
1169
if ( ux << 1 == 0 ) return x ;
1162
1170
var uxi = ux ;
1163
1171
if ( ! ex ) {
@@ -1236,7 +1244,7 @@ function expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)
1236
1244
const // see: musl/src/math/__expo2f.c
1237
1245
k = < u32 > 235 ,
1238
1246
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 ) ;
1240
1248
return NativeMathf . exp ( x - kln2 ) * scale * scale ;
1241
1249
}
1242
1250
@@ -1424,7 +1432,7 @@ export namespace NativeMathf {
1424
1432
if ( iy == 0 ) {
1425
1433
switch ( m ) {
1426
1434
case 0 :
1427
- case 1 : return y ;
1435
+ case 1 : return y ;
1428
1436
case 2 : return pi ;
1429
1437
case 3 : return - pi ;
1430
1438
}
@@ -1538,12 +1546,8 @@ export namespace NativeMathf {
1538
1546
hx &= 0x7FFFFFFF ;
1539
1547
if ( hx >= 0x42AEAC50 ) {
1540
1548
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 ;
1547
1551
}
1548
1552
}
1549
1553
var hi : f32 , lo : f32 ;
@@ -1889,8 +1893,9 @@ export namespace NativeMathf {
1889
1893
if ( iy >= 0x4B800000 ) yisint = 2 ;
1890
1894
else if ( iy >= 0x3F800000 ) {
1891
1895
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 ) ;
1894
1899
}
1895
1900
}
1896
1901
if ( iy == 0x7F800000 ) { // y is +-inf
@@ -1909,14 +1914,20 @@ export namespace NativeMathf {
1909
1914
z = ax ;
1910
1915
if ( hy < 0 ) z = 1.0 / z ;
1911
1916
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
+ }
1913
1921
else if ( yisint == 1 ) z = - z ;
1914
1922
}
1915
1923
return z ;
1916
1924
}
1917
1925
var sn = < f32 > 1.0 ;
1918
1926
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
+ }
1920
1931
if ( yisint == 1 ) sn = - 1.0 ;
1921
1932
}
1922
1933
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 {
2159
2170
var ey = < i32 > ( uy >> 23 & 0xFF ) ;
2160
2171
var sx = ux & 0x80000000 ;
2161
2172
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
+ }
2163
2177
var ux1 = ux << 1 ;
2164
2178
if ( ux1 <= uy1 ) {
2165
2179
if ( ux1 == uy1 ) return 0 * x ;
@@ -2380,3 +2394,27 @@ export function ipow64(x: i64, e: i32): i64 {
2380
2394
}
2381
2395
return out ;
2382
2396
}
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