C中的双截断和数学问题
我正在制作一个适合球进入盒子的功能.计算可以放在盒子每一侧的球数的代码如下.假设球如同立方体一样装配在一起.我知道这不是最佳方式,只是顺其自然.
对我来说问题是,虽然我得到了像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.
几乎可以肯定的是,被乘数(至少其中一些)不是它们的样子.如果它们恰好是4.0,4.0和2.0,那么它们的产品就是32.0.如果你打印出双打能够代表的所有数字,我很确定你会看到很多9,如3.99999999999 ……等等.因此,产品有点小于32. double-to-int转换只是简单地删除小数部分,所以最终得到31. 当然,如果计算精确的话,你并不总是得到比它们更小的数字;您还可以获得比您预期的更大的数字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby – 如何测试将puppet模板应用于给定测试参数
- c# – 如何在Unity AndroidJavaClass中访问枚举
- iphone – Xcode:在applicationDidBecomeActive
- 使用Webpack进行React-Bootstrap和/或Bootstrap
- React Redux: 从文档看源码 - Connect工具类篇(
- Flex 4 TabNavigator组件或TabBar加ViewStack组合
- 自定义登录控制类Demo
- oracle 12c 无法使用 os 认证登录数据库 ERROR:
- 重新设置VS 2008 中的开发语言
- Abap – 遍历xml文档的整个节点?