C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C中的双截断和数学问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个适合球进入盒子的功能.计算可以放在盒子每一侧的球数的代码如下.假设球如同立方体一样装配在一起.我知道这不是最佳方式,只是顺其自然. @H_696_5@ @H_696_5@对我来说问题是,然我得到了像4.0000000 * 4.0000000 * 2.000000这样的数字,但产品是31而不是32.产品是什么?

@H_696_5@另外两件事,这个错误只发生在达到最佳边长时;例如,边长为12.2,箱厚为.1,球半径为1.5.这导致正好4个球适合那一侧.如果我不把它作为一个int转换,它可以解决,但如果我作为一个int进行转换,我得到上述错误(31而不是32).此外,如果边长是最佳的,则打印线运行一次,但如果边长不是,则运行两次.我不知道这意味着什么.

@H_696_5@
double ballsFit(double r,double l,double w,double h,double Boxthick)
{
double ballsInL,ballsInW,ballsInH;
int ballsinBox;

ballsInL= (int)((l-(2*Boxthick))/(r*2));
ballsInW= (int)((w-(2*Boxthick))/(r*2));
ballsInH= (int)((h-(2*Boxthick))/(r*2));
ballsinBox=(ballsInL*ballsInW*ballsInH);
printf("LENGTH=%f\nWidth=%f\nHight=%f\nBALLS=%d\n",ballsInL,ballsInH,ballsinBox);
return ballsinBox;
}

解决方法

基本问题是浮点数学是不精确的. @H_696_5@ @H_696_5@例如,数字0.1 – 您在有问题的示例中提到的厚度值 – 不能完全表示为double.将0.1分配给变量时,存储的内容是0.1的近似值.

@H_696_5@我建议你阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic.

@H_696_5@ @H_696_5@几乎可以肯定的是,被乘数(至少其中一些)不是它们的样子.如果它们恰好是4.0,4.0和2.0,那么它们的产品就是32.0.如果你打印出双打能够代表的所有数字,我很确定你会看到很多9,如3.99999999999 ……等等.因此,产品有点小于32. double-to-int转换只是简单地删除小数部分,所以最终得到31.

@H_696_5@当然,如果计算精确的话,你并不总是得到比它们更小的数字;您还可以获得比您预期的更大的数字.

大佬总结

以上是大佬教程为你收集整理的C中的双截断和数学问题全部内容,希望文章能够帮你解决C中的双截断和数学问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。