加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的双截断和数学问题

发布时间:2020-12-16 09:39:54 所属栏目:百科 来源:网络整理
导读:我正在制作一个适合球进入盒子的功能.计算可以放在盒子每一侧的球数的代码如下.假设球如同立方体一样装配在一起.我知道这不是最佳方式,只是顺其自然. 对我来说问题是,虽然我得到了像4.0000000 * 4.0000000 * 2.000000这样的数字,但产品是31而不是32.产品是什
我正在制作一个适合球进入盒子的功能.计算可以放在盒子每一侧的球数的代码如下.假设球如同立方体一样装配在一起.我知道这不是最佳方式,只是顺其自然.

对我来说问题是,虽然我得到了像4.0000000 * 4.0000000 * 2.000000这样的数字,但产品是31而不是32.产品是什么?

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

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=%fnWidth=%fnHight=%fnBALLS=%dn",ballsInL,ballsInH,ballsinbox);
return ballsinbox;
}

解决方法

基本问题是浮点数学是不精确的.

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

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

although I get numbers like 4.0000000*4.0000000*2.000000 the product is 31 instead of 32. whats going on??

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读