// SS spreadsheet for approximations to square-root // a0:n0 = { "x", "sqrt(x)", "RP1", "|err|", "TA1", "|err|", "TA2", "|err|", "LLSQ", "|err|", "coef", "MinMax", "|err|", "coef" }; a18 = "||err||"; a20 = "max|err|"; fill a1:a16 0.5, 0.1; // x from 0.5 to 2.0 in steps of 0.1 b1:b16 = { sqrt(a1) }; eval; // true square-root values //--- // eyeball linear approximation and error // RP_slope = (sqrt(2)-0.5)/2; c1:c16 = { 0.5+a1*RP_slope }; d1:d16 = { fabs(c1-b1) }; d18 = sqrt(dot(d1:d16,d1:d16)); d20 = max(d1:d16); //--- // Taylor series linear approximation and error // TA1_slope = 0.5; e1:e16 = { 0.5+a1*TA1_slope }; f1:f16 = { fabs(e1-b1) }; f18 = sqrt(dot(f1:f16,f1:f16)); f20 = max(f1:f16); //--- // Taylor series quadratic approximation and error // TA2_c0 = 3/8; TA2_c1 = 6/8; TA2_c2 = -1/8; g1:g16 = { TA2_c0 + a1*(TA2_c1 + a1*TA2_c2) }; h1:h16 = { fabs(g1-b1) }; h18 = sqrt(dot(h1:h16,h1:h16)); h20 = max(h1:h16); //--- // Least-Square error quadratic polynomial approximation // LLSQ_c0 = k1; LLSQ_c1 = k2; LLSQ_c2 = k3; { rank, k1:k3 } = llsq( "poly", a1:a16, b1:b16); i1:i16 = { feval( "poly", $k$1:$k$3, a1) }; j1:j16 = { fabs(i1-b1) }; j18 = sqrt(dot(j1:j16,j1:j16)); j20 = max(j1:j16); //--- // Minimum Maximum error quadratic polynomial approximation // MinMax_c0 = n1; MinMax_c1 = n2; MinMax_c2 = n3; { n1:n3 } = search( m20, k1:k3); // start search with LLSQ values l1:l16 = { feval( "poly", $n$1:$n$3, a1) }; m1:m16 = { fabs(l1-b1) }; m18 = sqrt(dot(m1:m16,m1:m16)); m20 = max(m1:m16); eval; format "%.4f"; format symbols "%20.17f"; print symbols values; plot "sqrt.out" a1:i16;