通过对arcsinx的泰勒展开式求圆周率值

原理分析:

arcsinx的泰勒公式:

 

将sin(𝜋/6)=1/2 带入,

将多项式拆分成first_part和second_part,

testarcsinx = first_part * second_part

代码实现目标:

输入一位整数n,即让终端输出小数位数为n的𝜋值,如:

输入4,则输出3.1416

输入8,则输出3.14159265

code实现:

/*****************************/

#include<stdio.h>
double squre(double x,unsigned int n)
{
    int i;
    double temp = 1;
	temp = x;
    if(n >= 1)
    {
        for(i=1;i<n;i++)//注意:i要从1开始.
        {
            x=x*temp;
        }
    }
    else
        x = 1;
    return x;  
}
double first_part(int n)
{
    int i = 0;
    double ret = 0;
    double denominator = 1;
    double numerator = 1;
    for(i=1;i<=n;i++)
    {
        numerator = numerator*((2*i) - 1);
        denominator = denominator*(2*i);
    }
    ret = numerator/denominator;
    return ret;
}
double second_part(double x, int n)
{
    int i = 0;
    double numerator = 1;
    double denominator = 1;
    double pow = 0;
    double ret = 0;
    pow = 2*n + 1;
    numerator = squre(x,pow);
    denominator = pow;
    ret = numerator/denominator;
    return ret;
}
double test_arcsin(double x,int n)//注意:形参x类型务必不要弄错,x必须是double,否则此处导致错误
{
    int i = 0;
    double temp = 0;
	double first_part_value = 0;
	double second_part_value = 0;
    for(i=1; i<=n; i++)
    {
    	first_part_value = first_part(i);
		second_part_value = second_part(x,i);
        temp = temp + first_part(i)*second_part(x,i);
    }
    return temp;
}

int main()
{
	int n;
    double pi = 0;
    pi = 6*(0.5+test_arcsin(0.5,10));
    scanf("%d",&n);
	printf("%.*f\n",n,pi);//重点技巧:指定小数点后精度大小

}

 

/*****************************/

代码总结:

1.类型的长度:

float类型:单精度浮点数,占用4个字节,32bit,有效数字长度为8位

double类型:双精度浮点数,占用8个字节,64bit,有限数字长度为16位.

2.如何指定对应的小数精度输出.

printf("%.*f\n",n,pi);//重点技巧:指定小数点后精度大小为n,n的值会传给*,此n值可以很大,甚至可以达到50位小数长度.

它的效果等同于printf("%.5f",pi);即输出五位小数的值.

3.%f和%lf的区别

%f代表单精度浮点型数据(float),%lf代表双精度浮点型数据(double)。

另外一种说法供参考:首先printf无论是%f还是%lf没有区别,因为当printf函数当遇到float类型时会自动转化为double,从c语言标准来说printf并没有%lf的定义,虽然大多数编译器都能接受,但在做题时printf最好用%f,否则可能出现一些莫名其妙的错误;

4.指定精度输出时,会默认最后一位为四舍五入的结果.

 

第二种思路,利用先乘为整,然后再除的思路,利用%g输出对应小数,但是此方法%g最多只能输出到5位小数

/***方法2,先化整数强制转换后再变小数**/
int main()
{
	int n;
	double pi = 0;
    unsigned long multi; 
	double temp = 0;//注意temp不能位整型,否则会报错.
	
	scanf("%d",&n);
	multi = squre(10,n);
	pi = 6*(0.5+test_arcsin(0.5,10));
	pi = pi*multi + 0.5;//强制转换时四舍五入技巧:强制转换前+0.5
    temp = (unsigned long)pi;
    pi = temp/multi;
    printf("%g\n",pi);//技巧:%g,不输出有效值后的0,最多输出5位小数

}

第二种方法技术总结:

1.%g有限制,至多只能输出5位小数,所以需要显示更高精度的小数时不适合.

2.从浮点型强制转换成整型时,会直接舍弃小数部分,不会执行四舍五入,那么需要在转换前+0.5,然后结果就能够实现四舍五入的效果.

3.pi=temp/multi;其中如果pi是浮点型,那么temp也必须是浮点型.如果temp是整型,那么pi相当于将整型的结果强制转换成浮点型,那么小数点后全为0.

 

//2019年12月17日更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值