• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

树莓派里面的c语言(gcc编译)得不出正确结果

9604a3b72d92b876 2020-05-23 浏览量:784
long n=100000000;
double sum=0;
for(long i = 0;i < n; i++)
sum += (int)sqrt(n*(double)n-i*(double)i);

printf("pi=%.12f\n"(4.0 * (double)sum)/n/n);

上述代码,如果sum的类型是double,就没有问题,如果是int或long,就得不出正确结果,的确不明白为什么啊

补充:

看了几位回答,应该是我的问题不明确,在代码中的double sum=0;如果使用long sum或者int sum,就会得到不正确的结果(不是编译不通过)。

但事实上,我的sum的确也只用的整形的加减(sqrt的结果强制转换),至于打印的时候,为了打印出小数位,把int和long转换成double,我认为也是没有问题的。

大家怎么看?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:5
  • sqrt平方根函数大部分计算后会有小数部分所以要用double,如果用int和long小数都会忽略,那么计算肯定不对
9604a3b72d92b876 回复了 yhj416606438:感谢回答,sqrt内没有用到sum,sqrt外已经被强制去掉小数部分了。sum是用来统计圆形覆盖的小方格数。 回复

  • 你所谓的不对到底是最后输出不对,还是中间调试值不对

    如果仅仅是输出不对,可能是因为你最后的printf语句中%.12f这里问题,这里需要后面对应数据是浮点数的,否则输出是有问题的。

9604a3b72d92b876 回复了 xdsnet:感谢回答,不是%.12的原因,算式转换成double以后%.12应该不会超限。 回复

  • 因为前面计算的时候用了强制类型转换,得到的sum是个int型的值,后面再将她变为double的时候小数部分已经丢失了
9604a3b72d92b876 回复了 chen0000009:我的sum只需要使用整数就行,不需要小数。 回复

  • sqrt的结果是浮点的,你转成int后,小数位就丢掉了,结果差很多 了就

  • int 或是long是整型的,会省略到小数的,所以,最后的结果就会差很多,所以,你用double,保留小数时,结果就是对的了

相关问题

问题达人换一批

树莓派里面的c语言(gcc编译)得不出正确结果