原理分析:
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日更新