FUNCTION "CBR" : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
rX : REAL ;
iNoOfIterations : INT ;
END_VAR
VAR_OUTPUT
rXcuberoot : REAL ;
END_VAR
VAR_TEMP
rQbrApprox : REAL ;
rInv3rX : REAL ;
rQbrApprox_cubed : REAL ;
iLoopCount : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L #rX; // Kahans method. With a multiply in stead of a divide.
DTR ; // convert REAL to REAL (!? - dont think, just do it)
L 3.333333e-001; // load 0.33333333333
*R ; // multiply by 0.333333333 - same as divide by 3
RND ; // convert back to DINT (but it is a REAL, just close your eyes and do it)
L L#709921077; // load magic number
+D ; // add as DINT
T #rQbrApprox; // rQbrKahanApprox should be an approximated (rX)^1/3 (as REAL
L 3.333333e-001;
L #rX;
/R ;
T #rInv3rX;
L #iNoOfIterations; // to preserve cycle time, no test for counts less than 1 !
NEXT: T #iLoopCount;
L #rQbrApprox;
L #rQbrApprox;
*R ;
L #rQbrApprox;
*R ;
T #rQbrApprox_cubed;
L #rX;
L 4.000000e+000;
*R ;
L #rQbrApprox_cubed;
-R ;
L #rInv3rX;
*R ;
L #rQbrApprox;
*R ;
T #rQbrApprox;
L #iLoopCount;
LOOP NEXT;
L #rQbrApprox;
T #rXcuberoot;
END_FUNCTION