
对我来说问题是,虽然我得到了像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,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.
当然,如果计算精确的话,你并不总是得到比它们更小的数字;您还可以获得比您预期的更大的数字.
总结以上是内存溢出为你收集整理的C中的双截断和数学问题全部内容,希望文章能够帮你解决C中的双截断和数学问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)