| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 (function(global, utils) { | 5 (function(global, utils) { | 
| 6 "use strict"; | 6 "use strict"; | 
| 7 | 7 | 
| 8 %CheckIsBootstrapping(); | 8 %CheckIsBootstrapping(); | 
| 9 | 9 | 
| 10 // ------------------------------------------------------------------- | 10 // ------------------------------------------------------------------- | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 81 | 81 | 
| 82 // ES6 draft 09-27-13, section 20.2.2.3. | 82 // ES6 draft 09-27-13, section 20.2.2.3. | 
| 83 function MathAcosh(x) { | 83 function MathAcosh(x) { | 
| 84   x = TO_NUMBER(x); | 84   x = TO_NUMBER(x); | 
| 85   if (x < 1) return NaN; | 85   if (x < 1) return NaN; | 
| 86   // Idempotent for NaN and +Infinity. | 86   // Idempotent for NaN and +Infinity. | 
| 87   if (!NUMBER_IS_FINITE(x)) return x; | 87   if (!NUMBER_IS_FINITE(x)) return x; | 
| 88   return %math_log(x + %math_sqrt(x + 1) * %math_sqrt(x - 1)); | 88   return %math_log(x + %math_sqrt(x + 1) * %math_sqrt(x - 1)); | 
| 89 } | 89 } | 
| 90 | 90 | 
| 91 // ES6 draft 09-27-13, section 20.2.2.7. |  | 
| 92 function MathAtanh(x) { |  | 
| 93   x = TO_NUMBER(x); |  | 
| 94   // Idempotent for +/-0. |  | 
| 95   if (x === 0) return x; |  | 
| 96   // Returns NaN for NaN and +/- Infinity. |  | 
| 97   if (!NUMBER_IS_FINITE(x)) return NaN; |  | 
| 98   return 0.5 * %math_log((1 + x) / (1 - x)); |  | 
| 99 } |  | 
| 100 |  | 
| 101 // ES6 draft 09-27-13, section 20.2.2.17. | 91 // ES6 draft 09-27-13, section 20.2.2.17. | 
| 102 function MathHypot(x, y) {  // Function length is 2. | 92 function MathHypot(x, y) {  // Function length is 2. | 
| 103   // We may want to introduce fast paths for two arguments and when | 93   // We may want to introduce fast paths for two arguments and when | 
| 104   // normalization to avoid overflow is not necessary.  For now, we | 94   // normalization to avoid overflow is not necessary.  For now, we | 
| 105   // simply assume the general case. | 95   // simply assume the general case. | 
| 106   var length = arguments.length; | 96   var length = arguments.length; | 
| 107   var max = 0; | 97   var max = 0; | 
| 108   for (var i = 0; i < length; i++) { | 98   for (var i = 0; i < length; i++) { | 
| 109     var n = MathAbs(arguments[i]); | 99     var n = MathAbs(arguments[i]); | 
| 110     if (n > max) max = n; | 100     if (n > max) max = n; | 
| 111     arguments[i] = n; | 101     arguments[i] = n; | 
| 112   } | 102   } | 
| 113   if (max === INFINITY) return INFINITY; | 103   if (max === INFINITY) return INFINITY; | 
| 114 | 104 | 
| 115   // Kahan summation to avoid rounding errors. | 105   // Kahan summation to avoid rounding errors. | 
| 116   // Normalize the numbers to the largest one to avoid overflow. | 106   // Normalize the numbers to the largest one to avoid overflow. | 
| 117   if (max === 0) max = 1; | 107   if (max === 0) max = 1; | 
| 118   var sum = 0; | 108   var sum = 0; | 
| 119   var compensation = 0; | 109   var compensation = 0; | 
| 120   for (var i = 0; i < length; i++) { | 110   for (var i = 0; i < length; i++) { | 
| 121     var n = arguments[i] / max; | 111     var n = arguments[i] / max; | 
| 122     var summand = n * n - compensation; | 112     var summand = n * n - compensation; | 
| 123     var preliminary = sum + summand; | 113     var preliminary = sum + summand; | 
| 124     compensation = (preliminary - sum) - summand; | 114     compensation = (preliminary - sum) - summand; | 
| 125     sum = preliminary; | 115     sum = preliminary; | 
| 126   } | 116   } | 
| 127   return %math_sqrt(sum) * max; | 117   return %math_sqrt(sum) * max; | 
| 128 } | 118 } | 
| 129 | 119 | 
| 130 // ES6 draft 09-27-13, section 20.2.2.9. |  | 
| 131 // Cube root approximation, refer to: http://metamerist.com/cbrt/cbrt.htm |  | 
| 132 // Using initial approximation adapted from Kahan's cbrt and 4 iterations |  | 
| 133 // of Newton's method. |  | 
| 134 function MathCbrt(x) { |  | 
| 135   x = TO_NUMBER(x); |  | 
| 136   if (x == 0 || !NUMBER_IS_FINITE(x)) return x; |  | 
| 137   return x >= 0 ? CubeRoot(x) : -CubeRoot(-x); |  | 
| 138 } |  | 
| 139 |  | 
| 140 macro NEWTON_ITERATION_CBRT(x, approx) |  | 
| 141   (1.0 / 3.0) * (x / (approx * approx) + 2 * approx); |  | 
| 142 endmacro |  | 
| 143 |  | 
| 144 function CubeRoot(x) { |  | 
| 145   var approx_hi = %math_floor(%_DoubleHi(x) / 3) + 0x2A9F7893; |  | 
| 146   var approx = %_ConstructDouble(approx_hi | 0, 0); |  | 
| 147   approx = NEWTON_ITERATION_CBRT(x, approx); |  | 
| 148   approx = NEWTON_ITERATION_CBRT(x, approx); |  | 
| 149   approx = NEWTON_ITERATION_CBRT(x, approx); |  | 
| 150   return NEWTON_ITERATION_CBRT(x, approx); |  | 
| 151 } |  | 
| 152 |  | 
| 153 // ------------------------------------------------------------------- | 120 // ------------------------------------------------------------------- | 
| 154 | 121 | 
| 155 %InstallToContext([ | 122 %InstallToContext([ | 
| 156   "math_pow", MathPowJS, | 123   "math_pow", MathPowJS, | 
| 157 ]); | 124 ]); | 
| 158 | 125 | 
| 159 %AddNamedProperty(GlobalMath, toStringTagSymbol, "Math", READ_ONLY | DONT_ENUM); | 126 %AddNamedProperty(GlobalMath, toStringTagSymbol, "Math", READ_ONLY | DONT_ENUM); | 
| 160 | 127 | 
| 161 // Set up math constants. | 128 // Set up math constants. | 
| 162 utils.InstallConstants(GlobalMath, [ | 129 utils.InstallConstants(GlobalMath, [ | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 176 | 143 | 
| 177 // Set up non-enumerable functions of the Math object and | 144 // Set up non-enumerable functions of the Math object and | 
| 178 // set their names. | 145 // set their names. | 
| 179 utils.InstallFunctions(GlobalMath, DONT_ENUM, [ | 146 utils.InstallFunctions(GlobalMath, DONT_ENUM, [ | 
| 180   "random", MathRandom, | 147   "random", MathRandom, | 
| 181   "abs", MathAbs, | 148   "abs", MathAbs, | 
| 182   "pow", MathPowJS, | 149   "pow", MathPowJS, | 
| 183   "sign", MathSign, | 150   "sign", MathSign, | 
| 184   "asinh", MathAsinh, | 151   "asinh", MathAsinh, | 
| 185   "acosh", MathAcosh, | 152   "acosh", MathAcosh, | 
| 186   "atanh", MathAtanh, |  | 
| 187   "hypot", MathHypot, | 153   "hypot", MathHypot, | 
| 188   "cbrt", MathCbrt |  | 
| 189 ]); | 154 ]); | 
| 190 | 155 | 
| 191 %SetForceInlineFlag(MathAbs); | 156 %SetForceInlineFlag(MathAbs); | 
| 192 %SetForceInlineFlag(MathRandom); | 157 %SetForceInlineFlag(MathRandom); | 
| 193 %SetForceInlineFlag(MathSign); | 158 %SetForceInlineFlag(MathSign); | 
| 194 | 159 | 
| 195 // ------------------------------------------------------------------- | 160 // ------------------------------------------------------------------- | 
| 196 // Exports | 161 // Exports | 
| 197 | 162 | 
| 198 utils.Export(function(to) { | 163 utils.Export(function(to) { | 
| 199   to.MathAbs = MathAbs; | 164   to.MathAbs = MathAbs; | 
| 200   to.IntRandom = MathRandomRaw; | 165   to.IntRandom = MathRandomRaw; | 
| 201 }); | 166 }); | 
| 202 | 167 | 
| 203 }) | 168 }) | 
| OLD | NEW | 
|---|