C语言计算PI值1288位

C语言计算PI值

最近在温习C语言,偶然看见大师写的计算π值的代码,真的词穷了,一起膜拜膜拜:

文件:PI.c

#include <stdio.h>

long a = 10000, b = 0,
	 c = 10000, d, e,
	 f[10001], g;

int main() {
	for (; b != c; f[b++] = a / 5);
	for (; d = 0, g = c * 2, c > 5000; c++, printf("%.4d", e + d / a), e = d % a)
		for (b = c; d += f[b] * a, f[b] = d%--g, d /= g--, --b; d *= b);
	return 0;
}

使用gcc进行编译:

# gcc PI.c -o pi

运行:

# pi

运行效果(除开小数点共1288位):

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046

你有没有get到其中精髓?

### 高精度计算 Pi 的 C 语言实现 在高精度计算 Pi 的过程中,可以利用双向链表来存储中间结果并完成逐运算。以下是基于双向链表的 Pi 计算方法及其核心逻辑。 #### 双向链表定义 为了便于操作和管理大数运算中的每一,可以通过定义一个双向链表节点结构体 `Node` 来表示每一段数据[^2]: ```c typedef struct Node { int num; // 存储当前节点的数据部分 struct Node* next;// 指向下一节点 struct Node* prev;// 指向上一节点 } Node; ``` 此结构允许程序动态扩展或缩减链表长度,从而适应不同精度的需求。 #### 初始化链表 初始化链表时需创建头结点以及设置初始为零或其他默认状态。例如: ```c Node* initList() { Node* head = (Node*)malloc(sizeof(Node)); head->num = 0; head->next = NULL; head->prev = NULL; return head; } ``` 此处分配内存给新节点,并将其指针域置为空以标记单元素列表结束置。 #### 插入与删除节点函数 对于复杂的大数加减乘除来说,频繁地插入或者移除某些特定置上的节点是非常必要的功能之一。下面提供两个基本操作——向前/后方向追加新的节点实例代码片段作为参考: ```c void appendAfter(Node *current, int value){ Node *new_node = (Node *) malloc(sizeof(struct Node)); new_node->num=value; if(current==NULL){ printf("The given previous node cannot be NULL"); return ; } new_node->next=current->next; current->next=new_node; new_node->prev=current; if(new_node->next != NULL) new_node->next->prev= new_node; } // 类似可编写appendBefore() ``` 以上实现了在一个已存在节点之后新增另一个含有指定整数的新节点的功能。 #### 使用级数展开法求解圆周率 &pi; 一种常见的近似表达式如下所示: \[ \frac{\pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}\cdots \] 转换成适合计算机处理的形式即累加项形式,则有: \[ S_k=(-1)^k/(2*k+1), k>=0 \] 因此我们只需要不断迭代上述公式直到达到所需精确度即可停止循环[^1]。 具体算法伪码描述如下: 1. 设定变量sum初为0; 2. 对于每一个正奇数i从1开始做以下两步直至满足误差条件为止: a). 将(-1)^(floor(i/2))/(i)加入到sum当中去; b). 判断当前绝对差是否小于目标阈threshold;如果是则退出循环。 最终得到的结果就是所求数字&pi;的一半,记得最后要乘二恢复原形哦! 实际编码时还需要考虑溢出保护等问题,在这就不详述了。 ```c double pi_series(int terms_count){ double sum = 0.0f; bool sign=true; for(int i=1;i<=terms_count;i+=2){ sum +=sign*(1.0/i); sign=!sign; } return sum*4; } ``` 注意这只是一个简单的例子演示如何用C语言编程实现Pi估算过程的一部分而已,并未涉及任何关于提高效率的技术细节比如多线程加速之类的高级话题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值