1fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org"use strict"; 6a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 7e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// This file relies on the fact that the following declarations have been made 8e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// in runtime.js: 9e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// var $Object = global.Object; 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Keep reference to original values of some global properties. This 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// has the added benefit that the code in this file is isolated from 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// changes to these properties. 14f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $floor = MathFloor; 15f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $abs = MathAbs; 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Instance class name can only be set on functions. That is the only 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// purpose for MathConstructor. 1941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathConstructor() {} 20f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Math = new MathConstructor(); 21e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 22e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// ------------------------------------------------------------------- 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.1 2541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathAbs(x) { 26eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (%_IsSmi(x)) return x >= 0 ? x : -x; 27e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org x = TO_NUMBER_INLINE(x); 28f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org if (x === 0) return 0; // To handle -0. 29f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org return x > 0 ? x : -x; 30769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com} 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.2 33285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAcosJS(x) { 342f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return %MathAcos(TO_NUMBER_INLINE(x)); 35eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.3 38285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAsinJS(x) { 392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return %MathAsin(TO_NUMBER_INLINE(x)); 40eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.4 43285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAtanJS(x) { 442f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return %MathAtan(TO_NUMBER_INLINE(x)); 45eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.5 4868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org// The naming of y and x matches the spec, as does the order in which 4968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org// ToNumber (valueOf) is called. 50aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgfunction MathAtan2JS(y, x) { 512f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return %MathAtan2(TO_NUMBER_INLINE(y), TO_NUMBER_INLINE(x)); 52eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.6 55eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathCeil(x) { 5637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return -MathFloor(-x); 57eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.8 60eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathExp(x) { 61aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org return %MathExpRT(TO_NUMBER_INLINE(x)); 62eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.9 65eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathFloor(x) { 66e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org x = TO_NUMBER_INLINE(x); 6786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // It's more common to call this with a positive number that's out 6886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // of range than negative numbers; check the upper bound first. 690c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (x < 0x80000000 && x > 0) { 70eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Numbers in the range [0, 2^31) can be floored by converting 71eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // them to an unsigned 32-bit value using the shift operator. 72eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // We avoid doing so for -0, because the result of Math.floor(-0) 73eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // has to be -0, which wouldn't be the case with the shift. 740c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return TO_UINT32(x); 75eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } else { 76aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org return %MathFloorRT(x); 77eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 78eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.10 81eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathLog(x) { 82285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org return %_MathLogRT(TO_NUMBER_INLINE(x)); 83eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.11 8641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathMax(arg1, arg2) { // length == 2 8768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org var length = %_ArgumentsLength(); 88fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (length == 2) { 89e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org arg1 = TO_NUMBER_INLINE(arg1); 90e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org arg2 = TO_NUMBER_INLINE(arg2); 91fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg2 > arg1) return arg2; 92fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg1 > arg2) return arg1; 93fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg1 == arg2) { 940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Make sure -0 is considered less than +0. 950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg2 : arg1; 96fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 97fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org // All comparisons failed, one of the arguments must be NaN. 98690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org return NAN; 99fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 100690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org var r = -INFINITY; 10132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org for (var i = 0; i < length; i++) { 10213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org var n = %_Arguments(i); 103d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(n)) n = NonNumberToNumber(n); 1040cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Make sure +0 is considered greater than -0. 1050cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org if (NUMBER_IS_NAN(n) || n > r || (r === 0 && n === 0 && %_IsMinusZero(r))) { 10632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org r = n; 10732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org } 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return r; 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.12 11341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathMin(arg1, arg2) { // length == 2 11468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org var length = %_ArgumentsLength(); 115fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (length == 2) { 116e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org arg1 = TO_NUMBER_INLINE(arg1); 117e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org arg2 = TO_NUMBER_INLINE(arg2); 118fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg2 > arg1) return arg1; 119fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg1 > arg2) return arg2; 120fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org if (arg1 == arg2) { 1210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Make sure -0 is considered less than +0. 1220cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg1 : arg2; 123fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 124fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org // All comparisons failed, one of the arguments must be NaN. 125690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org return NAN; 126fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 127690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org var r = INFINITY; 12832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org for (var i = 0; i < length; i++) { 12913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org var n = %_Arguments(i); 130d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(n)) n = NonNumberToNumber(n); 1310cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Make sure -0 is considered less than +0. 1320cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org if (NUMBER_IS_NAN(n) || n < r || (r === 0 && n === 0 && %_IsMinusZero(n))) { 13332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org r = n; 13432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org } 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return r; 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.13 140eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathPow(x, y) { 141e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y)); 142eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 14341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 14441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.14 145f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgvar rngstate; // Initialized to a Uint32Array during genesis. 146eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathRandom() { 147f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org var r0 = (MathImul(18273, rngstate[0] & 0xFFFF) + (rngstate[0] >>> 16)) | 0; 148f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org rngstate[0] = r0; 149f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org var r1 = (MathImul(36969, rngstate[1] & 0xFFFF) + (rngstate[1] >>> 16)) | 0; 150f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org rngstate[1] = r1; 151f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org var x = ((r0 << 16) + (r1 & 0xFFFF)) | 0; 152f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // Division by 0x100000000 through multiplication by reciprocal. 153f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return (x < 0 ? (x + 0x100000000) : x) * 2.3283064365386962890625e-10; 154eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 15541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 15641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.15 157eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathRound(x) { 158e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org return %RoundNumber(TO_NUMBER_INLINE(x)); 159eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 16041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 16141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.17 162eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathSqrt(x) { 163aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org return %_MathSqrtRT(TO_NUMBER_INLINE(x)); 164eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 16541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 166ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// Non-standard extension. 167ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgfunction MathImul(x, y) { 168e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org return %NumberImul(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y)); 169ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 170ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 1714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.28. 1724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathSign(x) { 1734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org x = TO_NUMBER_INLINE(x); 1744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x > 0) return 1; 1754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x < 0) return -1; 1765fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org // -0, 0 or NaN. 1775fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org return x; 1784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 1794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 1804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.34. 1814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathTrunc(x) { 1824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org x = TO_NUMBER_INLINE(x); 1834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x > 0) return MathFloor(x); 1844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x < 0) return MathCeil(x); 1855fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org // -0, 0 or NaN. 1865fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org return x; 1874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 1884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 1894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.33. 1904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathTanh(x) { 1914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 1924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Idempotent for +/-0. 1934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x === 0) return x; 1944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Returns +/-1 for +/-Infinity. 1954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!NUMBER_IS_FINITE(x)) return MathSign(x); 1964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var exp1 = MathExp(x); 1974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var exp2 = MathExp(-x); 1984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return (exp1 - exp2) / (exp1 + exp2); 1994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.5. 2024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAsinh(x) { 2034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 2044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Idempotent for NaN, +/-0 and +/-Infinity. 2054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x === 0 || !NUMBER_IS_FINITE(x)) return x; 2064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x > 0) return MathLog(x + MathSqrt(x * x + 1)); 2074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // This is to prevent numerical errors caused by large negative x. 2084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return -MathLog(-x + MathSqrt(x * x + 1)); 2094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.3. 2124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAcosh(x) { 2134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 2144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x < 1) return NAN; 2154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Idempotent for NaN and +Infinity. 2164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!NUMBER_IS_FINITE(x)) return x; 2174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return MathLog(x + MathSqrt(x + 1) * MathSqrt(x - 1)); 2184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.7. 2214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAtanh(x) { 2224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 2234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Idempotent for +/-0. 2244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x === 0) return x; 2254c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Returns NaN for NaN and +/- Infinity. 2264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!NUMBER_IS_FINITE(x)) return NAN; 2274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return 0.5 * MathLog((1 + x) / (1 - x)); 2284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.21. 2314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathLog10(x) { 2324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return MathLog(x) * 0.434294481903251828; // log10(x) = log(x)/log(10). 2334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.22. 2374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathLog2(x) { 2384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return MathLog(x) * 1.442695040888963407; // log2(x) = log(x)/log(2). 2394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.17. 2424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathHypot(x, y) { // Function length is 2. 2434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // We may want to introduce fast paths for two arguments and when 2444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // normalization to avoid overflow is not necessary. For now, we 2454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // simply assume the general case. 2464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var length = %_ArgumentsLength(); 2474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var args = new InternalArray(length); 2484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var max = 0; 2494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org for (var i = 0; i < length; i++) { 2504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var n = %_Arguments(i); 2514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(n)) n = NonNumberToNumber(n); 2524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (n === INFINITY || n === -INFINITY) return INFINITY; 2534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org n = MathAbs(n); 2544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (n > max) max = n; 2554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org args[i] = n; 2564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 2574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Kahan summation to avoid rounding errors. 2594c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Normalize the numbers to the largest one to avoid overflow. 2604c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (max === 0) max = 1; 2614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var sum = 0; 2624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var compensation = 0; 2634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org for (var i = 0; i < length; i++) { 2644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var n = args[i] / max; 2654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var summand = n * n - compensation; 2664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var preliminary = sum + summand; 2674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compensation = (preliminary - sum) - summand; 2684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org sum = preliminary; 2694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 2704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return MathSqrt(sum) * max; 2714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.16. 2744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathFroundJS(x) { 2754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return %MathFround(TO_NUMBER_INLINE(x)); 2764c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2789d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// ES6 draft 07-18-14, section 20.2.2.11 2794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathClz32(x) { 2804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org x = ToUint32(TO_NUMBER_INLINE(x)); 2814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x == 0) return 32; 2824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var result = 0; 2834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Binary search. 2844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((x & 0xFFFF0000) === 0) { x <<= 16; result += 16; }; 2854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((x & 0xFF000000) === 0) { x <<= 8; result += 8; }; 2864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((x & 0xF0000000) === 0) { x <<= 4; result += 4; }; 2874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((x & 0xC0000000) === 0) { x <<= 2; result += 2; }; 2884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((x & 0x80000000) === 0) { x <<= 1; result += 1; }; 2894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return result; 2904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.9. 2934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// Cube root approximation, refer to: http://metamerist.com/cbrt/cbrt.htm 2944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// Using initial approximation adapted from Kahan's cbrt and 4 iterations 2954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// of Newton's method. 2964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathCbrt(x) { 2974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 2984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (x == 0 || !NUMBER_IS_FINITE(x)) return x; 2994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return x >= 0 ? CubeRoot(x) : -CubeRoot(-x); 3004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 3014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 3024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgmacro NEWTON_ITERATION_CBRT(x, approx) 3034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org (1.0 / 3.0) * (x / (approx * approx) + 2 * approx); 3044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgendmacro 3054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 3064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction CubeRoot(x) { 3074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var approx_hi = MathFloor(%_DoubleHi(x) / 3) + 0x2A9F7893; 3084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var approx = %_ConstructDouble(approx_hi, 0); 3094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org approx = NEWTON_ITERATION_CBRT(x, approx); 3104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org approx = NEWTON_ITERATION_CBRT(x, approx); 3114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org approx = NEWTON_ITERATION_CBRT(x, approx); 3124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return NEWTON_ITERATION_CBRT(x, approx); 3134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 3144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 31541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ------------------------------------------------------------------- 31641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 3171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SetUpMath() { 3181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org %CheckIsBootstrapping(); 319e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 32031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org %InternalSetPrototype($Math, $Object.prototype); 3219bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org %AddNamedProperty(global, "Math", $Math, DONT_ENUM); 322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %FunctionSetInstanceClassName(MathConstructor, 'Math'); 323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 3241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // Set up math constants. 3254610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org InstallConstants($Math, $Array( 3264610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org // ECMA-262, section 15.8.1.1. 3274610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "E", 2.7182818284590452354, 3284610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org // ECMA-262, section 15.8.1.2. 3294610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "LN10", 2.302585092994046, 3304610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org // ECMA-262, section 15.8.1.3. 3314610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "LN2", 0.6931471805599453, 3324610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org // ECMA-262, section 15.8.1.4. 3334610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "LOG2E", 1.4426950408889634, 3344610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "LOG10E", 0.4342944819032518, 3354610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "PI", 3.1415926535897932, 3364610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "SQRT1_2", 0.7071067811865476, 3374610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org "SQRT2", 1.4142135623730951 3384610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org )); 33941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 3401805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // Set up non-enumerable functions of the Math object and 34141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org // set their names. 34227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org InstallFunctions($Math, DONT_ENUM, $Array( 34341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "random", MathRandom, 34441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "abs", MathAbs, 345285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org "acos", MathAcosJS, 346285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org "asin", MathAsinJS, 347285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org "atan", MathAtanJS, 34841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "ceil", MathCeil, 3499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "cos", MathCos, // implemented by third_party/fdlibm 35041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "exp", MathExp, 35141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "floor", MathFloor, 35241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "log", MathLog, 35341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "round", MathRound, 3549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "sin", MathSin, // implemented by third_party/fdlibm 35541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "sqrt", MathSqrt, 3569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "tan", MathTan, // implemented by third_party/fdlibm 357aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org "atan2", MathAtan2JS, 35841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "pow", MathPow, 35941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "max", MathMax, 360ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org "min", MathMin, 3614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "imul", MathImul, 3624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "sign", MathSign, 3634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "trunc", MathTrunc, 364d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org "sinh", MathSinh, // implemented by third_party/fdlibm 365ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org "cosh", MathCosh, // implemented by third_party/fdlibm 3664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "tanh", MathTanh, 3674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "asinh", MathAsinh, 3684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "acosh", MathAcosh, 3694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "atanh", MathAtanh, 3704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "log10", MathLog10, 3714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "log2", MathLog2, 3724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "hypot", MathHypot, 3734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "fround", MathFroundJS, 3744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "clz32", MathClz32, 3754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org "cbrt", MathCbrt, 376e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org "log1p", MathLog1p, // implemented by third_party/fdlibm 377e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org "expm1", MathExpm1 // implemented by third_party/fdlibm 37841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org )); 3790cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 38037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org %SetInlineBuiltinFlag(MathCeil); 38137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org %SetInlineBuiltinFlag(MathRandom); 3820cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org %SetInlineBuiltinFlag(MathSin); 3830cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org %SetInlineBuiltinFlag(MathCos); 3841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org} 38541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 3861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpMath(); 387