需要帮助修复近似 pi 的算法

2024-01-27

我正在尝试为近似的算法编写 C 代码pi。它应该得到一个立方体的体积和该立方体内部球体的体积(球体的半径是立方体边长的 1/2)。然后我应该将立方体的体积除以球体的体积并乘以 6 以获得 pi。

它正在工作,但它在应该获得卷的部分做了一些奇怪的事情。我认为这与我为近似值选择的增量有关。 如果使用边长为 4 的立方体,则体积不是 64,而是 6400。如果是球体,则体积不是 33,而是 3334。等等。

有人能弄清楚吗?这是代码(我评论了相关部分):

#include <stdio.h>      

int in_esfera(double x, double y, double z, double r_esfera){
    double dist = (x-r_esfera)*(x-r_esfera) + (y-r_esfera)*(y-r_esfera) + (z-r_esfera)*(z-r_esfera);

    return  dist <= (r_esfera)*(r_esfera) ? 1 : 0;   
}   

double get_pi(double l_cubo){   
    double r_esfera = l_cubo/2;   
    double total = 0;
    double esfera = 0;    
//this is delta, for the precision. If I set it to 1E anything less than -1 the program continues endlessly. Is this normal?
    double delta = (1E-1);   

    for(double x = 0; x < l_cubo; x+=delta){
        printf("x => %f; delta => %.6f\n",x,delta);
        for(double y = 0; y <l_cubo; y+=delta){
            printf("y => %f; delta => %.6f\n",y,delta);
            for(double z = 0; z < l_cubo; z+=delta){
                printf("z => %f; delta => %.6f\n",z,delta);
                total+=delta;
                if(in_esfera(x,y,z,r_esfera))
                    esfera+=delta;
            }
        }
    }

    //attempt at fixing this
        //esfera/=delta;
        //total/=delta;
    //

//This printf displays the volumes. Notice how the place of the point is off. If delta isn't a power of 10 the values are completely wrong.   
    printf("v_sphere = %.8f; v_cube = %.8f\n",esfera,total);   

    return (esfera)/(total)*6;
}   

void teste_pi(){        
    double l_cubo = 4;    
    double pi = get_pi(l_cubo);

    printf("%.8f\n",pi);
}   

int main(){   
    teste_pi();
}

total+=delta;
if(in_esfera(x,y,z,r_esfera))
    esfera+=delta;

total and esfera are three-dimensional volumes whereas delta is a one-dimensional length. If you were tracking units you'd have m3 on the left and m on the right. The units are incompatible.

要修复它,立方体delta这样你在概念上就积累了微小的立方体而不是微小的线条。

total+=delta*delta*delta;
if(in_esfera(x,y,z,r_esfera))
    esfera+=delta*delta*delta;

这样做可以修复输出,并且也适用于任何值delta:

v_sphere = 33.37400000; v_cube = 64.00000000
3.12881250

请注意,该算法“适用于”任意delta值,但存在严重的准确性问题。它非常容易出现舍入问题。当delta是二的幂:1/64.01/100.0, 例如:

v_sphere = 33.50365448; v_cube = 64.00000000
3.14096761

另外,如果您希望程序运行得更快,请摆脱所有这些打印输出!或者至少是内循环中的那些......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助修复近似 pi 的算法 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • 如何将异常对象序列化为 xml 字符串

    我想要类似的东西 try code here catch Exception ex stringXML Exception toXML 这样 stringXML 的值就是
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 二维数组的列求和

    我有一个IEnumerable
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 清理 TPL 中的 CallContext

    根据我使用的是基于 async await 的代码还是基于 TPL 的代码 我在逻辑清理方面得到了两种不同的行为CallContext 我可以设置和清除逻辑CallContext如果我使用以下异步 等待代码 正如我所期望的 class Pr

随机推荐

  • Openfire Android PubSub 订阅请求批准

    我是 Openfire 的新手 因此我对 pubsub 功能有疑问 实际上 我已经创建了一个节点设置访问模型 as 授权 如下所示 PubSubManager mgr new PubSubManager xmpp getConnection
  • React Native 在 OnChange 中获取 TextInput 的名称

    我正在尝试为多个 TextInput 制作通用的 onChange 处理程序 然而 当我访问该事件时 我能得到的最好的结果是 event nativeEvent 它有 3 个键 事件计数 目标和文本 目标只是一个数字 我从文档中意识到 名称
  • MVC 5 种子用户和角色

    我一直在玩新的 MVC 5 我有一些使用代码优先迁移的模型 控制器和视图设置 我的问题是如何播种用户和角色 目前 我在 Configuration cs 的 Seed 方法中播种了一些参考数据 但在我看来 只有在某些内容首次到达 Accou
  • 如何在容器 div 内拥有具有固定页眉和页脚的可滚动正文?

    我有一个容器 div 有两个孩子 div 里面的元素 我想安置一个孩子 div 在顶部和其他孩子 div 在容器的底部 div 中间部分 内容 应在顶部和底部子项之间滚动 div 元素 我想要两个孩子 div 容器内的元素 div 具有固定
  • 单个文件中的多个类

    我无法将多个类放入一个文件中 例如 当我的文件如下所示 public class FirstClass public class SecondClass public class ThirdClass 我在编译过程中遇到错误 我不太确定是什
  • 加密 web.config 中的 appSettings

    我正在开发一个网络应用程序 它需要将用户名和密码存储在 web Config 中 它还引用一些由网络应用程序本身而不是客户端请求的 URL 我知道 Net 框架不允许提供 web config 文件 但我仍然认为以纯文本形式保留此类信息是不
  • 如何为Windows 7 32位系统安装tensorflow?我在我的系统中安装了python 3.5(32位)并安装了anaconda 3.4.4(32位)

    我只有32位系统 所以我安装了python 3 5 64位 发生错误 所以我成功安装了python 32位 然后我跟着那个文档 http tensorflow org install http tensorflow org install
  • 在 python 中将 IPOPT 与 Openmdao(或 pyoptsparse)结合使用

    大家好 我有一个小问题 我正在使用 openmdao 和 pyOptSparseDriver 它适用于某些求解器 例如 SLSQP PSQP 因此安装没有问题 现在我想用 IPOPT 尝试同样的操作 但是 pyoptsparse 没有给出代
  • 使用 NSBezierPath addClip - 如何反转剪辑

    使用 NSBezierPath addClip 仅将绘图限制在用于剪切的路径内部 我想做相反的事情 只在外面画 void drawRect NSRect dirtyRect NSBezierPath dontDrawInThis We wa
  • php中关闭数据库连接的使用

    我总是假设关闭数据库连接始终是一个好习惯 无论数据库 ORM如何 例如 mysql close Propel close 等 参考我的另一篇question https stackoverflow com questions 1236542
  • vue-class-component :调用类方法时出现 TS2339

    我正在使用 vue cli service 构建我的 vuejs 应用程序 构建成功 但在 webstorm IDE 中 我收到一些 TS2339 错误 测试 vue
  • 如何更改 PHP 用于记录到文件的默认时间戳?

    在 php ini 中 error log php errors log So all error log 调用进入文件php errors log 每行前面都有时间戳 例如 17 Jan 2012 18 05 04 是否可以修改该时间戳
  • WPF 窗口中的透明 PNG

    我尝试将具有透明度的 PNG 图像应用到整个窗口 但窗口始终是白色的 有什么线索可以看到 PNG 的透明度吗 谢谢你 C public SplashScreen InitializeComponent var myBrush new Ima
  • 如果默认值不存在则后备背景图像

    我想将图像设置为背景 但图像名称可能是bg png or bg jpg 如果默认背景不存在 是否有任何非 javascript 方法可以创建替代图像的后备 body background url bg png background size
  • C# Json 将任何动态对象转换为键值对

    我正在编写一个工具 它将获取入站 Json 对象 并将其转换为 键值记录 有时可能称为扁平化 目的是避免工具在获取非常大或非常嵌套的 Json 对象时崩溃 因此我想避免递归 一个示例对象可能像这样 如下 包含嵌套数组 空值 你能想到的任何合
  • 在wxPHP中更新属性时如何刷新wxAuiManager窗格?

    我设置了一个简单的wxAuiManager系统包含八个文本控件 每个控件都设置为一个窗格 全部围绕一个中央静态控件排列 我有两个分别捕捉到顶部 左侧 右侧和底部窗格方向 这部分工作正常 我现在想修改每个窗格的属性 我认为可以通过重置关联的来
  • 使用 Fetch API 递归返回分页输出

    Summary 我想使用 JavaScript 的 Fetch API 递归地将分页输出整理到数组中 从 Promise 开始 我认为 async await 函数会更合适 Attempt 这是我的方法 global fetch requi
  • 为什么 Windows 上的 strftime() 返回 false? (我没有使用%e)

    这是我的代码 var dump strftime m d Y l M S time echo br var dump strftime Y d m H M S time 第一行返回 false 第三行返回预期的字符串 2012 10 09
  • 计算 NYSE 交易日的函数

    希望有人可以提供一个给定日期的函数 它将返回纽约证券交易所当月的交易日 如果考虑到假期 那就是额外的好处 如果没有 我也不太担心 提前致谢 我的个人包中有一个函数 名为TradingDates使用假期的 日历从timeDate http c
  • 需要帮助修复近似 pi 的算法

    我正在尝试为近似的算法编写 C 代码pi 它应该得到一个立方体的体积和该立方体内部球体的体积 球体的半径是立方体边长的 1 2 然后我应该将立方体的体积除以球体的体积并乘以 6 以获得 pi 它正在工作 但它在应该获得卷的部分做了一些奇怪的