news 2026/9/13 12:25:39

接近于pi的程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接近于pi的程序

在一个平静的午后,两个神秘的数字悄然相遇了。它们分别是-1031158223和-328227871。这两个数字看起来普普通通,但谁知它们背后隐藏着一段令人惊叹的奇幻之旅。

这两个数字其实是π的两位探险家,它们决定通过一次除法运算来探索π的奥秘。它们知道,这次探险的结果将是一个新的有理数,而这个有理数将无限接近那个神秘而迷人的π。

停停停!!!哪有这么写文章的,

离了大谱。

——————————————不怎么华丽的分割线————————————————————

终于,结果出现了!它是一个令人震撼的有理数:3.1415925157678033。这个数字虽然与π还有微小的差距,但它已经足够接近π了,足以让这两个探险家心满意足。

这次奇幻之旅结束了,但两个数字之间的友谊却永远不会结束。它们知道,在未来的日子里,它们还会继续探索π的奥秘,寻找更多与π有关的有理数。

又来了

不是这样的……

是这样子的我本来想要找一个接近于pi的分数,想着想着就写起了程序……(虾扯)。虽然说-1031158223和-328227871一除是3.1415925157678033,所以……所以什么来着……

#include <iostream> #include <cmath> #include <limits> int continuedFractionTerm(int n) { if (n == 0) return 1; if (n % 2 == 0) { return 2 * n + 1; } else { return 2 * n; } } std::pair<int, int> bestRationalApproximation(double target, int maxDenominator) { int numerator = 0; int denominator = 1; int prevNumerator = 1; int prevDenominator = 0; double bestDiff = std::numeric_limits<double>::max(); for (int i = 0; i < maxDenominator; ++i) { int term = continuedFractionTerm(i); int newNumerator = prevDenominator + term * prevNumerator; int newDenominator = prevNumerator; prevNumerator = newNumerator; prevDenominator = newDenominator; double currentPi = static_cast<double>(newNumerator) / newDenominator; double diff = std::abs(currentPi - target); if (diff < bestDiff) { bestDiff = diff; numerator = newNumerator; denominator = newDenominator; } } return {numerator, denominator}; } int main() { const double pi_approx = 3.141592653897932384; int maxDenominator = 100000000; std::pair<int, int> approximation = bestRationalApproximation(pi_approx, maxDenominator); std::cout << "最接近π的分数是: " << approximation.first << "/" << approximation.second << std::endl; std::cout << "差异是: " << std::abs(static_cast<double>(approximation.first) / approximation.second - pi_approx) << std::endl; return 0; }

哎好吧就这样

这种方法基于连分数,但是它会找到最接近给定实数的有理数。在这个情况下是π,它可以用来找到最佳有理逼近。

这里面我用的是3.141592653897932384和100000000想改的可以改。

全曲终!

注:int在大量迭代下会溢出,上面那个负数结果很可能就是溢出产物,不是真正的连分数收敛值。想复现的话把int换成long long__int128试试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 12:23:55

STM32硬件I2C真实缺陷与工程级规避方案

1. 这个问题背后&#xff0c;藏着STM32开发者十年没说破的集体默契“STM32的硬件I2C有BUG吗&#xff1f;”——这句话在嵌入式论坛、技术群、甚至大厂内部代码评审会上&#xff0c;几乎每年都会被拎出来重提一次。它不像“UART为什么收不到数据”那样有明确现象&#xff0c;也不…

作者头像 李华
网站建设 2026/9/13 12:22:15

家具行业获客服务商实测推荐与避坑指南

1. 项目概述最近三年在家具行业摸爬滚打&#xff0c;发现获客渠道的选择直接决定了生意成败。2023-2026年期间&#xff0c;我亲自测试了市面上12家主流家具获客服务商&#xff0c;今天就把实测有效的5家靠谱公司分享给大家&#xff0c;附带详细合作体验和避坑指南。这个分享特别…

作者头像 李华
网站建设 2026/9/13 12:21:14

视觉小说翻译器:HOOK、OCR与剪贴板的完整上手指南

视觉小说翻译器&#xff1a;HOOK、OCR与剪贴板的完整上手指南 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 游戏文本刚在屏幕上显示&#xff0c;中文翻译已经跟在后面—…

作者头像 李华
网站建设 2026/9/13 12:20:50

什么是连接池?在PHP应用中如何实现数据库连接池?

连接池是什么&#xff1f;连接池就像是一个“蓄水池”&#xff0c;里面存放着许多已经建立好的连接。当需要连接数据库或其他服务时&#xff0c;不是每次都新建一个连接&#xff0c;而是从连接池里取出一个已经存在的连接来使用。这样做的好处是可以提高性能和效率&#xff0c;…

作者头像 李华