c语言中的莱布尼兹函数
我在寻找C中π的莱布尼兹近似值 我已经测试过这个函数,但它似乎不起作用:c语言中的莱布尼兹函数,c,math,pi,approximation,C,Math,Pi,Approximation,我在寻找C中π的莱布尼兹近似值 我已经测试过这个函数,但它似乎不起作用: float leibnizPi(float n){ double pi=1.0; int i; int N; for (i=3, N=2*n+1; i<=N; i+=2) pi += ((i&2) ? -1.0 : 1.0) / i; return 4*pi; } float-leibnizPi(float n){ 双pi=1.0; int i; in
float leibnizPi(float n){
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
float-leibnizPi(float n){
双pi=1.0;
int i;
int N;
对于(i=3,N=2*N+1;i我已经测试了您的函数,它似乎工作正常。对于N=1000
,我得到的结果是3.142592
我是如何测试该功能的:
#include <stdio.h>
float leibnizPi(float n) {
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
int main(void)
{
printf("Pi: %f\n", leibnizPi(1000));
return 0;
}
#包括
浮动莱布尼兹皮(浮动n){
双pi=1.0;
int i;
int N;
对于(i=3,N=2*N+1;i我已经测试了您的函数,它似乎工作正常。对于N=1000
,我得到的结果是3.142592
我是如何测试该功能的:
#include <stdio.h>
float leibnizPi(float n) {
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
int main(void)
{
printf("Pi: %f\n", leibnizPi(1000));
return 0;
}
#包括
浮动莱布尼兹皮(浮动n){
双pi=1.0;
int i;
int N;
对于(i=3,N=2*N+1;iOP的代码有趣地使用double
数学进行计算,然后在一个潜在的长循环后返回一个float
。而不是截断为float。建议返回一个double
。使用float
,结果预计不会比223中的1部分更精确
下面显示了不必要的影响,在n>约100000次之后变得明显,最终约600000次
float leibnizPif(float n){
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
double leibnizPid(float n){
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
int main() {
double pi = acos(-1);
float f1 = pi;
float f2 = nextafterf(pi, 0);
printf("%e\n", f1-f2);
printf(" pi %.12e\n", pi);
for (unsigned i=1; i<29; i++) {
unsigned n = 1u << i;
float f = leibnizPif(n);
double d = leibnizPid(n);
printf("%9u f % .5e %.12e ", n, (f-pi)/pi, f);
printf("d % .5e %.12e\n", (d-pi)/pi, d);
}
printf(" pi %.12e\n", acos(-1));
return 0;
}
修改代码输出
// with changes to use 64-bit integer math for the loops,
// the result continue to get better returning double.
// It just takes longer and longer.
1073741824 f 2.78275e-08 3.141592741013e+00 d 2.95864e-10 3.141592654519e+00
2147483648 f 2.78275e-08 3.141592741013e+00 d 1.47599e-10 3.141592654053e+00
4294967296 f 2.78275e-08 3.141592741013e+00 d 7.34476e-11 3.141592653821e+00
8589934592 f 2.78275e-08 3.141592741013e+00 d 3.63406e-11 3.141592653704e+00
OP的代码使用double
数学进行计算,然后在一个潜在的长循环返回一个float
。而不是截断为一个float。建议返回一个double
。使用float
,结果预计不会比223中的1部分更精确
下面显示了不必要的影响,在n>约100000次之后变得明显,最终约600000次
float leibnizPif(float n){
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
double leibnizPid(float n){
double pi=1.0;
int i;
int N;
for (i=3, N=2*n+1; i<=N; i+=2)
pi += ((i&2) ? -1.0 : 1.0) / i;
return 4*pi;
}
int main() {
double pi = acos(-1);
float f1 = pi;
float f2 = nextafterf(pi, 0);
printf("%e\n", f1-f2);
printf(" pi %.12e\n", pi);
for (unsigned i=1; i<29; i++) {
unsigned n = 1u << i;
float f = leibnizPif(n);
double d = leibnizPid(n);
printf("%9u f % .5e %.12e ", n, (f-pi)/pi, f);
printf("d % .5e %.12e\n", (d-pi)/pi, d);
}
printf(" pi %.12e\n", acos(-1));
return 0;
}
修改代码输出
// with changes to use 64-bit integer math for the loops,
// the result continue to get better returning double.
// It just takes longer and longer.
1073741824 f 2.78275e-08 3.141592741013e+00 d 2.95864e-10 3.141592654519e+00
2147483648 f 2.78275e-08 3.141592741013e+00 d 1.47599e-10 3.141592654053e+00
4294967296 f 2.78275e-08 3.141592741013e+00 d 7.34476e-11 3.141592653821e+00
8589934592 f 2.78275e-08 3.141592741013e+00 d 3.63406e-11 3.141592653704e+00
我认为模运算的&
应该是%
你的输出是什么?显示a。@bhowI
总是奇怪的,所以你的建议会产生一个常量。@是的,我的错误。看来我没有仔细阅读它。I&2
部分是正确的。对于I=3,7,11,…,这将是正确的,但不是5,9,13…为什么n
afloat
显然只是一个计数?否则它看起来很好。你为什么认为有错误?换句话说,你给它什么输入,你得到什么输出,你认为它们应该是什么?我认为&
对于模运算应该是%
,你的输出是什么?显示a.@bhowi
总是很奇怪,所以你的建议会产生一个常数。@a是对的,我的错误。似乎我没有仔细阅读它。i&2
部分是正确的。对于i=3,7,11……这是正确的,但不是5,9,13……为什么n
afloat
显然只是一个计数呢?否则就错了看起来不错。你为什么认为有错误?换句话说,你给了它什么输入,你得到了什么输出,你认为它们应该是什么?我认为这是正确的。我用n=1000000
试过了,它似乎收敛了,只需要很多术语。我认为这是正确的。我用n=1000000
试过了,它似乎是收敛,这需要很多术语。