C中的双截断和数学问题

Coo*_*117 3 c math double

我正在制作一个适合球进入盒子的功能.计算可以放在盒子每一侧的球数的代码如下.假设球如同立方体一样装配在一起.我知道这不是最佳方式,只是顺其自然.

对我来说问题是,虽然我得到了像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=%f\nWidth=%f\nHight=%f\nBALLS=%d\n", ballsInL, ballsInW, ballsInH, ballsinbox);
return ballsinbox;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 6

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

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

我建议您阅读科学家应该知道的关于浮点运算的内容.

虽然我得到像4.0000000*4.0000000*2.000000这样的数字,但产品是31而不是32.产品是怎么回事?

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

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