鱼C论坛

 找回密码
 立即注册
查看: 2959|回复: 23

[已解决]s1e16 求π值,我的除法为什么没有小数?

[复制链接]
发表于 2022-6-19 16:12:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求π值,说真的,我感觉并不难。把循环节变成语句就成功了。但是难在这一个个坑。这次的坑是:为什么我写的除法不保留小数,网上查,都说除数、被除数有一个使用浮点数或者双精度就可以保留小数的,我尝试着前后都用了小数了,还是不行。用的系统是虚拟机Ubuntu 16.04,06,听说不同的系统会有小的诧异,但是一个系统不应该不会保留小数吧,求教怎么整。
#include<stdio.h>

int i=-1;
float   pai, jie,j=1.0;

int main()
{
 while (jie>=0.00000001)
  {
        j=j+2.0;
        jie=(float)1.0/j;
         pai=1+i*jie;
        printf("%f ",pai);
        i=-i;
  }
 printf("π约值为%.7f\n",4*pai);
return 0;
}
最佳答案
2022-6-19 20:59:20
顶级太阳 发表于 2022-6-19 19:25
我在第13行加了一个测试是否进入循环的输出,一开始晃过一些稍微大于1的数字,不到1秒后,就满屏幕都是1. ...

       这回你的判断又出错了,把每一个 i 都用 printf() 输出会消耗非常巨大的 CPU 时间,实际上,你的代码并没有陷入死循环,一方面,是你把所有的 i 打印到同一行,所有的 i 值都粘到了一起,毫无参考价值,另一方面,用 printf() 打印每一个 i 值非常费时间,结果,没等程序结束,你就断言死循环了,你再运行一下我改的代码看看。
#include<stdio.h>

int main(void)
{

double pi;
int d,e,f,k,i=1;
for(pi=1.0,e=1e8,k=3,f=-1;k<=e;k+=2,f=-f)
  {
        i++                                  ;
        if(! (i % 100000))printf("%d\n" , i) ;
        pi+=f*1.0/k                          ;
  }
printf("pi=%.8lf\n",pi*4);

return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-19 16:35:27 | 显示全部楼层
所谓的不保留小数是什么意思?输出是什么?0.0000000?
全局变量 jie 不初始化,jie = 0.00. while条件判断 jie >= 0.00000001 ?
为什么会认为进了循环呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 16:54:26 From FishC Mobile | 显示全部楼层
风车呼呼呼 发表于 2022-6-19 16:35
所谓的不保留小数是什么意思?输出是什么?0.0000000?
全局变量 jie 不初始化,jie = 0.00. while条件判 ...

也没有开销全局变量的必要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 17:00:10 | 显示全部楼层
本帖最后由 jackz007 于 2022-6-19 18:15 编辑

        先别急着甩锅,试过这个代码再说话。
#include <stdio.h>

main(void)
{
        double pi                                                                             ;
        int d , e , f , k                                                                     ;
        for(pi = 1.0 , e = 1e8 , k = 3 , f = -1 ; k <= e ; k += 2 , f = -f) pi += f * 1.0 / k ;
        printf("pi = %.8lf\n" , pi * 4)                                                       ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-19 19:25:56 | 显示全部楼层
风车呼呼呼 发表于 2022-6-19 16:35
所谓的不保留小数是什么意思?输出是什么?0.0000000?
全局变量 jie 不初始化,jie = 0.00. while条件判 ...

我在第13行加了一个测试是否进入循环的输出,一开始晃过一些稍微大于1的数字,不到1秒后,就满屏幕都是1.0000000了。那么我个人判断jie没有执行小数部分,没有把1/jie的结果加进第11行去了。我得出这样的判断不对么?

to:jackz007
    你的答复简单粗暴,很有艺术性,远超我现在的能力。说真的,我是跟着视频开始接触C语言的,基础还很差,甚至不理解你给出的main(void)括号里是什么意思,谢谢,运行很成功。在我的电脑上运行结果是3.14159263.
    但是我想要的不只是一个符合题目要求的答案。我想知道的是我的写法为什么不成。
   同时我很好奇循环运行了多少次,把你的代码试着增加了计数器后,运行就不成功了。下面是我运行的代码,结果是进入了死循环。能不能解释一下这是为什么呢?
#include<stdio.h>

int main(void)
{

 double pi;
 int d,e,f,k,i=1;
 for(pi=1.0,e=1e8,k=3,f=-1;k<=e;k+=2,f=-f)
  {
        i++;
        printf("%d",i);
        pi+=f*1.0/k;
  }
 printf("pi=%.8lf\n",pi*4);

return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 20:40:51 | 显示全部楼层
顶级太阳 发表于 2022-6-19 19:25
我在第13行加了一个测试是否进入循环的输出,一开始晃过一些稍微大于1的数字,不到1秒后,就满屏幕都是1. ...

没太看懂你说的加了什么没加什么,但目测你说的都是while循环体里的差异。
而我说的是循环条件 jie >=0.00000001,jie是0,本身就不可能进得了循环。除非贴的代码和你运行的根本不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 20:59:20 | 显示全部楼层    本楼为最佳答案   
顶级太阳 发表于 2022-6-19 19:25
我在第13行加了一个测试是否进入循环的输出,一开始晃过一些稍微大于1的数字,不到1秒后,就满屏幕都是1. ...

       这回你的判断又出错了,把每一个 i 都用 printf() 输出会消耗非常巨大的 CPU 时间,实际上,你的代码并没有陷入死循环,一方面,是你把所有的 i 打印到同一行,所有的 i 值都粘到了一起,毫无参考价值,另一方面,用 printf() 打印每一个 i 值非常费时间,结果,没等程序结束,你就断言死循环了,你再运行一下我改的代码看看。
#include<stdio.h>

int main(void)
{

double pi;
int d,e,f,k,i=1;
for(pi=1.0,e=1e8,k=3,f=-1;k<=e;k+=2,f=-f)
  {
        i++                                  ;
        if(! (i % 100000))printf("%d\n" , i) ;
        pi+=f*1.0/k                          ;
  }
printf("pi=%.8lf\n",pi*4);

return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-19 22:14:57 | 显示全部楼层
针对“风车呼呼呼”的指点,jie的初始值是未知的,程序极大可能不会进入循环,我对jie设置了一个不用进入计算的初始值,只为了能够开始第一次的循环。
#include<stdio.h>

int i=(-1);
float   pai, jie=1.0,j=1.0;//这里jie=1.0并不参与计算,只是为了能够第一次进入循环

int main()
{
 while (jie>=0.00000001)
  {
        j=j+2.0;
        jie=(float)1.0/j;
         pai=1+i*jie;
        printf("%f ",pai);
        i=-i;
  }
 printf("π约值为%.7f\n",4*pai);
return 0;
}
运行的瞬间我按下ctrl+C,没有抢到最前面的运行结果(计算机就是比我手快,服气)。截取到了这个结果。里面是0.99996和1.000004之间的交替出现。理论上,应该是一个从1开始,逐渐变小,越来越接近0.785398的数字才是正确的结果。我想知道为什么上面的代码运行结果会是这样。


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-20 06:41:07 From FishC Mobile | 显示全部楼层
顶级太阳 发表于 2022-6-19 22:14
针对“风车呼呼呼”的指点,jie的初始值是未知的,程序极大可能不会进入循环,我对jie设置了一个不用进入计 ...

发贴最基本要素,你连求π公式都没发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-20 07:55:26 | 显示全部楼层
本帖最后由 顶级太阳 于 2022-6-21 08:22 编辑
wp231957 发表于 2022-6-20 06:41
发贴最基本要素,你连求π公式都没发


我发的代码里,π的计算公式在第12、16行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-22 09:57:44 | 显示全部楼层
故障消失了,消失的莫名其妙,就像它莫名其妙的来。到现在我也没有整明白为啥错误。刚刚把程序又编辑一遍,能够得出正确的结果了。莫名其妙,难道计算机或者说C语言经常会出现这种莫名其妙的事情么?这让我怎么能够放心,安心的使用程序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 15:47:22 | 显示全部楼层
顶级太阳 发表于 2022-6-22 09:57
故障消失了,消失的莫名其妙,就像它莫名其妙的来。到现在我也没有整明白为啥错误。刚刚把程序又编辑一遍, ...

你写的程序出了问题,那一定是你的问题
不是C语言的问题,也不是编译器的问题,也不是操作系统的问题
你写的程序出了问题,你不应该甩锅给C语言,也不应该甩锅给编译器,也不应该甩锅给操作系统
你应该自我反省,调试自己写的程序,而不是甩锅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:04:29 | 显示全部楼层
顶级太阳 发表于 2022-6-22 09:57
故障消失了,消失的莫名其妙,就像它莫名其妙的来。到现在我也没有整明白为啥错误。刚刚把程序又编辑一遍, ...

#include <stdio.h>

//int i = (-1); // 加括号做什么?
int i = -1;
float pai, jie = 1.0, j = 1.0; //这里jie=1.0并不参与计算,只是为了能够第一次进入循环

int main() {
    while(jie >= 0.00000001) {
        j = j + 2.0;
        jie = (float)1.0 / j;
        pai = 1 + i * jie;
        //printf("%f ", pai);
        printf("%f\n", pai);     // 你全挤在一行怎么看?
        i = -i;
    }
    printf("π约值为%.7f\n", 4 * pai);       // 为什么是4*pai ?
                                           // 你用的哪个公式计算的 π ?
    return 0;
}

/* 
$ gcc-debug -o main main.c
$ ./main | less
0.666667
1.200000
0.857143
1.111111
0.909091
1.076923
0.933333
1.058824
0.947368
1.047619
0.956522
1.040000
0.962963
1.034483
0.967742
1.030303
0.971429
1.027027
0.974359
1.024390
0.976744
1.022222
0.978723
1.020408
0.980392
1.018868
0.981818
1.017544
0.983051
1.016393
0.984127
1.015385
0.985075
1.014493
0.985915
1.013699
0.986667
:
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-25 16:14:36 | 显示全部楼层

初学者,没有办法,不会看很多行,不知道你的这个运行可以保留多少行的结果,我的是虚拟机,用了Xshell5运行的。运行结果可以保留7000行左右,这种不知道循环次数的运算,抓了很多次没有抓到最开始的数据,把结果全挤一行里是为了能够多看到一些结果。
i=(-1):一开始写的也是i=-1,一直运行不出来正确结果,后来在一次修改时考虑是不是这里会有不同,尝试了一下,看结果一样,就没理它,至少没什么影响了。
我这个里用的pai 是计算给出的计算式,而最终的π是这个式子的4倍,所以输出结果时乘了4.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:16:58 | 显示全部楼层
本帖最后由 人造人 于 2022-6-25 16:18 编辑

看起来不像梅欽類公式
1.bmp

看起来也不像蒙特卡洛法
2.bmp

https://www.zhihu.com/question/24940378
https://zhuanlan.zhihu.com/p/114320417

所以,你用的哪个公式?
提问题不说明你用的哪个公式?让我们猜?
我再去百度找找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:20:37 | 显示全部楼层
奇怪,图片显示不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:23:39 | 显示全部楼层
本帖最后由 人造人 于 2022-6-25 16:24 编辑

蒙特卡洛法: 2.bmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:26:42 | 显示全部楼层
梅欽類公式: 1.bmp

你用的哪个公式?看起来不是这两个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:28:54 | 显示全部楼层
顶级太阳 发表于 2022-6-25 16:14
初学者,没有办法,不会看很多行,不知道你的这个运行可以保留多少行的结果,我的是虚拟机,用了Xshell5 ...

我这个里用的pai 是计算给出的计算式
你没有给出计算式

而最终的π是这个式子的4倍
哪个式子 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 16:33:07 | 显示全部楼层
好了,找到了(大概吧)

CalcPi.bmp

你直接把这个公式发出来不就好了,还得我们自己百度 你计算pi用的哪个公式
话说,是这个公式吗?

http://www.cppfans.com/articles/basecalc/c_pi_10000.asp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 10:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表