2016-10-10 03:43:44 +02:00
|
|
|
// 20.2.2.16 Math.fround(x)
|
2017-05-27 17:36:13 +02:00
|
|
|
var $export = require('./_export')
|
|
|
|
, sign = require('./_math-sign')
|
2016-10-10 03:43:44 +02:00
|
|
|
, pow = Math.pow
|
|
|
|
, EPSILON = pow(2, -52)
|
|
|
|
, EPSILON32 = pow(2, -23)
|
|
|
|
, MAX32 = pow(2, 127) * (2 - EPSILON32)
|
|
|
|
, MIN32 = pow(2, -126);
|
|
|
|
|
|
|
|
var roundTiesToEven = function(n){
|
|
|
|
return n + 1 / EPSILON - 1 / EPSILON;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
$export($export.S, 'Math', {
|
|
|
|
fround: function fround(x){
|
|
|
|
var $abs = Math.abs(x)
|
|
|
|
, $sign = sign(x)
|
|
|
|
, a, result;
|
|
|
|
if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
|
|
|
|
a = (1 + EPSILON32 / EPSILON) * $abs;
|
|
|
|
result = a - (a - $abs);
|
|
|
|
if(result > MAX32 || result != result)return $sign * Infinity;
|
|
|
|
return $sign * result;
|
|
|
|
}
|
|
|
|
});
|