michael@0: /* michael@0: * Copyright (C) Rich Moore. All rights reserved. michael@0: * michael@0: * Redistribution and use in source and binary forms, with or without michael@0: * modification, are permitted provided that the following conditions michael@0: * are met: michael@0: * 1. Redistributions of source code must retain the above copyright michael@0: * notice, this list of conditions and the following disclaimer. michael@0: * 2. Redistributions in binary form must reproduce the above copyright michael@0: * notice, this list of conditions and the following disclaimer in the michael@0: * documentation and/or other materials provided with the distribution. michael@0: * michael@0: * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY michael@0: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE michael@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR michael@0: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR michael@0: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, michael@0: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, michael@0: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR michael@0: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY michael@0: * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT michael@0: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE michael@0: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: */ michael@0: michael@0: /////. Start CORDIC michael@0: michael@0: var AG_CONST = 0.6072529350; michael@0: michael@0: function FIXED(X) michael@0: { michael@0: return X * 65536.0; michael@0: } michael@0: michael@0: function FLOAT(X) michael@0: { michael@0: return X / 65536.0; michael@0: } michael@0: michael@0: function DEG2RAD(X) michael@0: { michael@0: return 0.017453 * (X); michael@0: } michael@0: michael@0: var Angles = [ michael@0: FIXED(45.0), FIXED(26.565), FIXED(14.0362), FIXED(7.12502), michael@0: FIXED(3.57633), FIXED(1.78991), FIXED(0.895174), FIXED(0.447614), michael@0: FIXED(0.223811), FIXED(0.111906), FIXED(0.055953), michael@0: FIXED(0.027977) michael@0: ]; michael@0: michael@0: michael@0: function cordicsincos() { michael@0: var X; michael@0: var Y; michael@0: var TargetAngle; michael@0: var CurrAngle; michael@0: var Step; michael@0: michael@0: X = FIXED(AG_CONST); /* AG_CONST * cos(0) */ michael@0: Y = 0; /* AG_CONST * sin(0) */ michael@0: michael@0: TargetAngle = FIXED(28.027); michael@0: CurrAngle = 0; michael@0: for (Step = 0; Step < 12; Step++) { michael@0: var NewX; michael@0: if (TargetAngle > CurrAngle) { michael@0: NewX = X - (Y >> Step); michael@0: Y = (X >> Step) + Y; michael@0: X = NewX; michael@0: CurrAngle += Angles[Step]; michael@0: } else { michael@0: NewX = X + (Y >> Step); michael@0: Y = -(X >> Step) + Y; michael@0: X = NewX; michael@0: CurrAngle -= Angles[Step]; michael@0: } michael@0: } michael@0: return CurrAngle; michael@0: } michael@0: michael@0: ///// End CORDIC michael@0: michael@0: function cordic( runs ) { michael@0: var actual; michael@0: michael@0: for ( var i = 0 ; i < runs ; i++ ) { michael@0: actual = cordicsincos(); michael@0: } michael@0: michael@0: assertEq(actual, 1834995.3515519998) michael@0: } michael@0: michael@0: cordic(25000);