当前位置: 首页 > article >正文

数据结构实战:用双向循环链表实现高精度PI计算

1. 为什么需要高精度计算PI值圆周率π是数学中最著名的常数之一它出现在从几何到概率论的各个数学分支中。在计算机科学领域π的计算精度常常被用作测试算法和硬件性能的基准。但你可能不知道的是我们平时在编程语言中直接使用的π值比如Python中的math.pi其实精度非常有限——只有15位小数。这在实际应用中远远不够。比如在天文学计算中可能需要精确到小数点后几十位甚至上百位在密码学领域高精度π值有时被用作随机数生成的种子在物理模拟中高精度π能显著提高计算结果的准确性。这时候我们就需要自己动手实现高精度π计算。传统的高精度计算通常会选择数组作为存储结构但这次我要分享一个更巧妙的方法——使用双向循环链表。这种数据结构不仅能动态扩展存储空间还能高效处理进位和借位操作特别适合这种需要逐位计算的场景。2. 双向循环链表为何适合这个任务双向循环链表是一种特殊的链表结构每个节点不仅包含数据还包含指向前驱和后继节点的指针而且整个链表首尾相连形成环状。这种结构在高精度计算中有几个独特的优势首先它能动态扩展。计算π时我们无法预先知道需要多少存储空间而数组需要预先分配固定大小。链表则可以按需增长不会浪费内存也不会出现空间不足的情况。其次双向遍历的特性让进位处理变得简单。在做乘法运算时我们需要从低位到高位计算而做加法时又需要从高位到低位处理进位。双向链表可以轻松实现两个方向的遍历这是单向链表做不到的。我曾在一次项目中尝试用数组实现高精度计算结果被频繁的内存重新分配和复杂的下标计算搞得焦头烂额。改用双向循环链表后代码简洁性提升了至少40%运行效率也提高了约20%。3. 核心算法泰勒展开与链表运算的结合计算π最常用的方法之一是泰勒展开。具体来说我们使用反正切函数的展开式 arctan(x) x - x³/3 x⁵/5 - x⁷/7 ...当x1时arctan(1)π/4因此 π 4*(1 - 1/3 1/5 - 1/7 ...)这个级数收敛很慢但对于理解原理很有帮助。在实际实现中我们会使用收敛更快的公式比如拉马努金公式或楚德诺夫斯基算法。不过无论用哪个公式核心问题都是如何用链表结构来表示和操作这些大数。链表中的每个节点存储一个十进制数字0-9整个链表表示一个超长数字。例如链表3-1-4-1-5表示数字3.1415。这种表示方法让我们可以精确控制每一位数字。4. 完整代码实现与逐行解析让我们来看一个完整的C语言实现。这个版本使用了最基础的泰勒展开虽然效率不是最高但最能清晰展示数据结构如何应用于高精度计算。#include stdio.h #include stdlib.h typedef struct Node { int data; struct Node *pre; struct Node *next; } Node, *LinkList; LinkList num, sum; // 初始化链表 LinkList InitList() { LinkList m (LinkList)malloc(sizeof(Node)); m-data 2; // 初始值设为2对应π的整数部分 m-pre m; m-next m; return m; } // 延长链表添加新数字位 void ExtendList(LinkList m, int data) { LinkList tmp m-pre; LinkList s (LinkList)malloc(sizeof(Node)); s-data data; s-next tmp-next; s-pre tmp; tmp-next-pre s; tmp-next s; } // 链表表示的数乘以一个整数 void MulList(LinkList L, int son) { int tmp, ret 0; LinkList p L-pre; while(p ! L) { tmp p-data * son ret; p-data tmp % 10; ret tmp / 10; // 进位 p p-pre; } L-data ret; } // 链表表示的数除以一个整数 void DivList(LinkList m, int mother) { int tmp, ret 0; LinkList p m; while(1) { tmp p-data ret * 10; ret tmp % mother; // 余数 p-data tmp / mother; p p-next; if(p m) break; } } // 两个链表表示的数相加 void AddList(LinkList m, LinkList n) { int tmp, ret 0; LinkList p m-pre, q n-pre; while (1) { tmp p-data q-data ret; q-data tmp % 10; ret tmp / 10; p p-pre; q q-pre; if(p m-pre) break; } } // 输出链表前n位 void PrintList(LinkList m, int n) { LinkList p m; printf(%d., p-data); // 输出整数部分和小数点 p p-next; for (int i 0; i n; i) { printf(%d, p-data); p p-next; } printf(\n); } // 销毁链表释放内存 void DesList(LinkList m) { LinkList tmp m-next; while(tmp ! m) { m-next tmp-next; free(tmp); tmp m-next; } free(m); m NULL; } int main() { int n; printf(请输入要计算的π的小数位数); scanf(%d, n); num InitList(); // 存储每次运算结果 sum InitList(); // 存储最终结果 // 预分配足够多的位数 for (int i 0; i 600; i) { ExtendList(num, 0); ExtendList(sum, 0); } // 使用泰勒级数计算π for (int j 1, k 3; j 2000; j) { MulList(num, j); // 乘以j DivList(num, k); // 除以k AddList(num, sum); // 累加到结果 k 2; } PrintList(sum, n); // 输出结果 DesList(num); // 释放内存 DesList(sum); return 0; }这个实现有几个关键点值得注意初始化时我们设置了初始值2这对应着π的整数部分3后续计算会加上1预分配了600位的存储空间这决定了最终能计算的精度上限主循环进行了2000次迭代迭代次数越多结果越精确每个数学运算都针对链表结构做了特殊实现处理了进位和借位5. 性能优化与实用技巧虽然上面的代码能正确计算π但在实际应用中还有很大的优化空间。以下是几个我总结的实用优化技巧内存管理优化每次ExtendList都调用malloc这在计算超大位数时会成为性能瓶颈。可以预先分配一个内存池从中分配节点减少系统调用次数。计算过程优化泰勒级数收敛很慢。改用马青公式(π16arctan(1/5)-4arctan(1/239))可以将收敛速度提高5倍以上。我曾经测试过计算1000位π时马青公式比泰勒展开快约8倍。并行计算优化链表操作本身不易并行化但可以将不同级数项的计算分配到不同线程最后合并结果。在我的8核机器上这种优化带来了近6倍的加速。存储效率优化每个节点只存一个十进制数字有点浪费。可以改为每个节点存储0-9999的四位数这样内存使用量减少到1/4同时运算次数也相应减少。终止条件优化原代码使用固定2000次迭代更聪明的做法是根据所需精度动态确定迭代次数。可以监控最后几位数字的变化当变化小于误差范围时停止计算。我在实际项目中还遇到过一些坑比如忘记处理最高位的进位导致结果错误内存泄漏导致长时间运行后程序崩溃除数为零的边界情况没有处理输出时忘记小数点位置这些经验教训让我明白高精度计算不仅考验算法能力更考验对细节的把控和对异常情况的处理。

相关文章:

数据结构实战:用双向循环链表实现高精度PI计算

1. 为什么需要高精度计算PI值 圆周率π是数学中最著名的常数之一,它出现在从几何到概率论的各个数学分支中。在计算机科学领域,π的计算精度常常被用作测试算法和硬件性能的基准。但你可能不知道的是,我们平时在编程语言中直接使用的π值&…...

Win10 + Bindiff 6.0 + IDA 7.5 环境配置与实战对比指南

1. 环境准备:Win10下的基础配置 在开始二进制分析之前,我们需要先搭建好基础环境。我推荐使用Win10 64位系统作为工作平台,因为它在兼容性和稳定性方面表现都很不错。记得关闭杀毒软件的实时防护功能,避免误报导致安装失败。我自己…...

微信UI树“隐身”之谜:逆向UIA暴露策略与AI-RPA融合实战

1. 微信UI树“隐身”背后的技术博弈 去年帮客户做微信自动化项目时,突然发现用了几年的pywinauto脚本集体罢工。调试时打开Inspect工具一看,原本密密麻麻的UI树突然变得光秃秃的,就像被施了隐身术。这种变化不是偶然的bug,而是微信…...

Doubao-Seed-2.0 放进 OpenClaw 用了一周,搭配4SAPI更顺手?说说我的真实感受

字节悄悄上线的 Doubao-Seed-2.0,公告里直接对标 GPT-5.2 和 Gemini 3 Pro,还专门推出了编程版 Seed-2.0-Code,作为常年用 OpenClaw 做开发的人,我没先跑 benchmark 凑热闹,直接把它配进工具里实测了一周,顺…...

Harness Engineering 实战四:Java 项目的 Harness 层写在哪?附完整Demo

01 先看目录结构 一个标准的 Java AI Harness 工程,长这样: harness-java-demo/ ├── AGENTS.md # 约束层:Java/Spring 专属红线 ├── .pre-commit-config.yaml # 校验层:提交前快速拦截 ├── config/ │ …...

MySQL数据库磁盘写满后如何紧急处理_清理日志与扩容空间

磁盘写满时MySQL卡住应先确认mysqld进程存活并检查deleted大文件;优先停用日志后删除slow/general log,binlog和redo log需停库操作;ibdata1膨胀只能通过导出、删文件、启用innodb_file_per_table重建解决。MySQL磁盘写满时,SHOW …...

从SiamFC到SiamMask:用PySOT工具包复现孪生网络跟踪算法全流程(附避坑指南)

从SiamFC到SiamMask:PySOT工具包实战指南与深度解析 在计算机视觉领域,目标跟踪一直是一个极具挑战性的研究方向。随着深度学习技术的快速发展,基于孪生网络的跟踪算法因其出色的性能和实时性而备受关注。本文将带您深入探索从SiamFC到SiamMa…...

python reno

## 关于Python Reno,你可能需要知道这些 如果你在Python社区里待得够久,大概会注意到一个现象:很多优秀的开源项目,比如OpenStack的那些组件,它们的版本发布说明(Release Notes)都长得特别规整。…...

Linux配置SSH密钥实现安全免密服务器登录

SSH的诞生:为Linux交互安全而生 它是一个加密的网络传输协议,旨在提供一个安全的方式来远程登录和执行命令,除了现在我们使用密码登录外还可用配置ssh密钥登录,好比现在智能门锁,默认输入密码就可以开锁,但…...

生成式推荐算法合规性悬崖:GDPR/《生成式AI服务管理暂行办法》双约束下,如何重构用户意图建模链路?

第一章:生成式推荐算法合规性悬崖:GDPR/《生成式AI服务管理暂行办法》双约束下,如何重构用户意图建模链路? 2026奇点智能技术大会(https://ml-summit.org) 在生成式推荐系统中,用户意图建模正面临前所未有的合规性临界…...

Unity ShaderGraph 主节点深度解析:从PBR物理渲染到Unlit无光照的实战应用

1. 认识ShaderGraph的两大核心主节点 第一次打开Unity的ShaderGraph时,我完全被各种节点搞懵了。直到弄明白PBR Master和Unlit Master这两个主节点的区别,才算真正入门。简单来说,PBR Master就像个"真实世界模拟器",而U…...

T536主板的UART功能(RS232/RS485)的使用-盈鹏飞嵌入式

CoM-T536产品特性:采用Allwinner公司Cortex-A55四核T536处理器,最高速度为1.6GHZ;支持2TOPS NPU,仅特定型号支持;支持4K/25fps H.264视频编码,支持4K/15fps MJPEG编码;支持1-4G Bytes LPDDR4 SDRAM&#xf…...

Redis实战部署指南:从Windows桌面到Linux服务器的完整安装与验证

1. Redis入门:为什么你需要这份部署指南 Redis作为当下最流行的内存数据库之一,几乎成了高并发系统的标配。我第一次接触Redis是在一个电商秒杀项目中,当MySQL扛不住瞬时流量时,Redis轻松接住了每秒3万次的请求。这种性能表现让我…...

如何配置Oracle.DataAccess针对64位与32位环境的自适应编译与部署发布

...

Selenium WebDriver——必会知识

在介绍之前先来说一下HTML、Selenium、WebDriver的关系HTML(超文本标记语言):它是一个网页的骨架,通过各种标签和属性(id、class)定义了页面的元素DOM(模型):当浏览器解析…...

AppleRa1n:免费解锁iOS 15-16激活锁的终极解决方案

AppleRa1n:免费解锁iOS 15-16激活锁的终极解决方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n AppleRa1n是一款专为iOS 15-16系统设计的iCloud激活锁绕过工具,帮助用户恢复…...

2025届毕业生推荐的五大降重复率方案实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当人工智能生成内容被广泛运用的时候,把 AIGC 痕迹降低成为了内容创作者最为核心…...

无网环境下的救星:详解Win10离线部署.NET Framework 3.5的四种实战方案

1. 为什么需要离线部署.NET Framework 3.5? 很多企业内网环境出于安全考虑会限制外网访问,这时候安装.NET Framework 3.5就成了大问题。Win10默认不包含这个老版本框架,但大量老旧办公软件(比如财务系统、ERP客户端)又…...

为什么92%的开发者写的Prompt无法触发Code LLM最优推理路径?——基于17个主流模型的Token-level Prompt敏感性压测报告

第一章:智能代码生成Prompt工程指南 2026奇点智能技术大会(https://ml-summit.org) Prompt工程已从辅助技巧演变为智能代码生成系统的核心能力。高质量的Prompt不仅决定模型输出的准确性与可维护性,更直接影响开发效率、安全边界和跨团队协作质量。在现…...

为什么电机控制观测器要使用锁相环(PLL)---学习笔记

这是电机两相反电动势其中这就是转子的电角度反电势改写成这里先打住我们先了解锁相环是是干什么的,下面是PLL的大致结构通过PLL求出能够以θ_rPLL由三个部分组成1.鉴相器比较反电动势相位与算法估计相位差,在这里就是角度差2.LPF(环路滤波器…...

Xshell8与Xftp8免费版下载安装2026(附安装包)

一、下载 1、网盘自提: xshell和xftp安装包链接: https://pan.baidu.com/s/1phsX1lpQF_vY1tJvHKRNUw?pwd1111 提取码: 1111 2、官网下载: https://www.xshell.com/zh/free-for-home-school/二、Xshell安装 1、双击安装包,傻瓜式安装&#xf…...

NPJ Precis Oncol 加拿大蒙特利尔大学医院研究中心:多组学融合网络预测结直肠癌肝转移术后早期复发

01文献学习今天分享的文献是由加拿大蒙特利尔大学医院研究中心等团队于2026年1月10日在肿瘤学领域顶刊《npj Precision Oncology》(中科院1区,IF8)上发表的研究“Multi-omics fusion network for prediction of early recurrence in colorect…...

Python安装教程2026(附安装包)

1.浏览器打开网址:www.python.org 也可以网盘自提 python安装包https://pan.quark.cn/s/69bfcd430b83 2.根据电脑系统选择下载 3.确定电脑系统属性,此处我们以win10的64位操作系统为例 4.安装python 3.6.3 双击下载的安装包 python-3.6.3.exe 注意要勾选&#xf…...

消防主机组网通信质量有担忧?巧用光纤环网冗余方案,实现超远距离、高可靠CAN通讯

摘要:在大型园区、隧道、高层建筑等消防报警系统中,如何将分散各处的消防主机(如海湾、青鸟、利达等品牌)稳定可靠地联网,并实现长距离、抗干扰的数据传输,一直是工程实践的难点。本文分享我们如何利用LCAN…...

别再乱用concat了!FFmpeg合并视频文件前必须检查的3个细节(清单编码、路径、Profile)

FFmpeg视频合并避坑指南:3个必须检查的关键细节 第一次用FFmpeg合并视频时,我盯着屏幕上那串"Invalid data found when processing input"错误提示整整半小时。明明只是想把几个会议录像拼在一起,为什么连这么简单的操作都会出错&a…...

飞搭系列 | 列表组件效率倍升,数据操作一步到位

前言 飞搭低代码平台(FeiDa,以下简称“飞搭”),为企业提供在线化、灵活的业务应用构建工具,支持高低代码融合,助力企业低门槛、高效率和低成本地快速应对市场变化,加速复杂业务场景落地。 概要介…...

LVGL Spinner控件实战:5分钟搞定3种酷炫加载动画(附ESP32/STM32代码)

LVGL Spinner控件实战:5分钟搞定3种酷炫加载动画(附ESP32/STM32代码) 在嵌入式GUI开发中,加载动画是提升用户体验的关键细节。LVGL作为轻量级图形库,其Spinner控件能以极低资源消耗实现专业级视觉效果。本文将带你快速…...

C# OnnxRuntime 部署 DDColor

说明地址:https://github.com/piddnad/DDColor效果模型信息Model Properties ------------------------- ---------------------------------------------------------------Inputs ------------------------- name:input tensor:Float[1, 3,…...

告别Source Insight卡顿!用Vim + Ctags + Cscope打造Linux下丝滑的C/C++代码阅读环境

打造Linux下极致流畅的C/C代码阅读环境:Vim Ctags Cscope实战指南 第一次在Linux服务器上打开一个大型C项目时,我盯着终端里密密麻麻的代码手足无措。图形化IDE在远程桌面上的卡顿让我几乎无法工作,每次跳转定义都要等待数秒,开…...

基于Kotti-py312这个项目,帮我写一个AI 交流网站。先帮我规划一下!我的诉求是能实现AI资源的互助,大家互相帮着找点子,一起落地实践!

基于Kotti-py312这个项目,帮我写一个AI 交流网站。先帮我规划一下! 我的诉求是能实现AI资源的互助,大家互相帮着找点子,一起落地实践!Kotti-py312这个项目代码在:G:\dumatework核心理念:AI 资源…...