不管是浮点数还是整数,在计算机内部都是以二进制计算为最快捷的.因此,计算和保存应该使用二进制,只有需要显示的时候才需要转换成十进制数,以及其它形式的数.
1.根据系统的实际,确定数据处理过程中小数点后应该保留的有效位数是多少,比如是5位,那么参与运算的数据全部放大,乘上100000.
2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围.
如果上2条满足,就适合将浮点转换成整数计算了.
============================================ 用个简单例子看具体的处理和设计.
假定一个系统通过测汽车轮子转速来计算距离,一个脉冲表示轮子转一圈,轮子的直径为0.485米.那么理论计算公式是: S = N * 3.1415926... * 0.485 S 为距离(米) N 为脉冲个数(肯定是整数)
那么我们就要首先确定计算结果的精度.根据实际情况,距离的精度到达毫米即可.因此计算中的精度为毫米.这样轮子的直径为485.0毫米,4位有效数字.然后将3.1415926变成整数31416,放大10000,5位有效(保证计算精度). 那么S = (N * 31416 * 485) / (10000) 毫米 ====>(2)
接下来看无符号长整型数为4个字节,表示最大数为:4294967295,那么: 4294967295 / 31416 / 485 == 281.88 (N的值) 因此,2式中的N最大不能超过281.
取N为280,为1秒内轮子转动的圈数,则280*3.1416*0.485 = 426.63米/秒 换算成公里/小时为:1535.85公里/小时!! 实际汽车的速度不可能这么快,所以N不会超过280个/每秒.2式可以使用.
这样浮点的计算换成了整数计算.
系统可以每一秒计算一次: 将在一秒内测得的圈数N,按N*31416*485计算(纯整数计算). 计算结果的小数点左移7位显示速度(米/秒), 计算结果除10000(单位毫米)送距离累加.
//----------------------------------------------------------------- 以上是别人的帖子。转过来的,自己写太麻烦!文中一个观点我不赞同,“2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围”,如果,32位不能保证精度怎么办?那就扩呀,扩展成64位,哈哈,方法和51单片机实现方式差不多。这种方法实现起来确实不如直接用浮点方便,但是速度快多了,sqrt也不能调用库函数,找一个整数开方的函数。 |