手算开2、3次方的公式验证

目前来看,以下算法开2次方能在百分之2以内的精度,开3次方能在百分之6以内的精度,而且误差主要出在20以内。200以上则是千分位误差

`

using System;

using System.Collections.Generic; using System.Linq; using System.Text;

namespace KaiFangTest { class Program { static void Main(string[] args) { for (int i = 4; i <= 100000; i++) { float i2 = get2(i); //i2 = (float)Math.Truncate((double)i210)/10; //i2 = (i2 + i / i2 ) / 2; float wuCha = Math.Abs(((i2 * i2) - i) / i); if (Math.Abs(wuCha) > 0.01) System.Console.WriteLine(i.ToString() + " " + i2.ToString("N2") + " " + (wuCha).ToString("N4")); } System.Console.WriteLine("********"); for (int i = 8; i <= 10000; i++) { float i3 = get3(i); //i3 = (float)Math.Truncate((double)i310)/10; //i3 = (2 * i3 + i / i3 / i3) / 3; float wuCha = Math.Abs((( i3* i3 * i3) - i) / i); if (wuCha > 0.1) System.Console.WriteLine(i.ToString() + " " + i3.ToString("N3") + " " + (wuCha).ToString("N4")); }

        //for (int i = 2; i < 100; i++)
        //    System.Console.WriteLine(i.ToString() + " " + find2(i));
    }

    static float get2(int t)
    {
        float a = find2(t);
        return (a + t / a) / 2;
    }

    static float find2(int t)
    {
        for (int i = 0; i < t; i++)
            if (i * i == t)
                return i;
            else 
                if (i * i > t)
            {
                int small = i - 1;
                int result =i;
                if ( (result * result - t) != Math.Min(result * result - t, t - small * small))
                    result = small;
                float misus = (i * i  - t) / (t - small * small );
                if (misus > 0.5 && misus < 2)
                    return (float)(small + 0.5);
                return result;
            }
        return 0;
    }

    static float get3(float t)
    {
        float a = find3(t);
        return (a*2 + t / a/a) / 3;
    }

    static float find3(float t)
    {
        for (int i = 0; i < t; i++)
            if (i * i*i == t)
                return i;
            else if (i * i*i > t)
            {
                int small = i - 1;
                int result = i;
                if ((result * result * result - t) != Math.Min(result * result * result - t, t - small* small * small))
                    result = small;
                float misus = (i*i*i-t)/(t - small* small * small);
                if (misus > 0.3 && misus < 3)
                    return (float)(small + 0.5);
                return result;
            }
        return 0;
    }
}

} `

转载于:https://my.oschina.net/sqhua/blog/1137844

function pp = comppi(el) % el : 需要的小数位数(如 100) % pp : 1×el 向量,保存 π 的前 el 位十进制小数(不含 3.) wanted = el; % 目标位数 guard = 10; % 多一点,防止最后四舍五入误差 total = wanted + guard; % 实际计位数 %% ---------- 1. 计 arctan(1/5) ---------- x1 = 5; % 预先把 1/5 的级数写成 Σ (-1)^k * 1 / ( (2k+1)*5^{2k+1} ) % 把分子、分母都放大 10^{total} 倍,用整数做 scale = 10^(total); % 整体放大因子 sum1_num = 0; k = 0; while true denom = (2*k + 1) * power(x1, 2*k + 1); % 分母 term = scale / denom; % 整数项(向下取整) if term == 0 break; % 后续项已小于 1,可忽略 end if mod(k,2) == 0 sum1_num = sum1_num + term; else sum1_num = sum1_num - term; end k = k + 1; end %% ---------- 2. 计 arctan(1/239) ---------- x2 = 239; sum2_num = 0; k = 0; while true denom = (2*k + 1) * power(x2, 2*k + 1); term = scale / denom; if term == 0 break; end if mod(k,2) == 0 sum2_num = sum2_num + term; else sum2_num = sum2_num - term; end k = k + 1; end %% ---------- 3. 组合 Machin 公式 ---------- % π ≈ 16*arctan(1/5) - 4*arctan(1/239) % 放大后就是 (16*sum1_num - 4*sum2_num) / scale total_num = 16*sum1_num - 4*sum2_num; % 把整数部分 3 去掉,只留下小数部分用于长除 total_num = total_num - 3*scale; %% ---------- 4. 工长除法 ---------- % 现在 total_num < scale,做 total_num / scale % 通过不断乘 10 取整得到每一位小数 pp = zeros(1, wanted); pp(1)=3; r = abs(total_num); % 余数 n = scale; for pos = 2:wanted r = r * 10; q = floor(r / n); % 这一位的数字 pp(pos) = q; r = mod(r, n); % 新的余数 end pp=pp end 在保证输出结果不变,且不用MATLAB符号工具箱的前提下精简代码
最新发布
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值