【发布时间】:2010-11-17 05:22:01
【问题描述】:
我是嵌入式应用程序的编程爱好者。该应用程序需要速度。我想确定某个变量(称为“X”)是否超过了另一个变量(称为“Z”)的某个百分比(称为“Y”)。
X、Y 和 Z 都可以在运行时更改。由于我需要速度,因此我想使用整数数学而不是浮点数来执行此操作,这会导致速度损失。
这样做有什么技巧吗?我是一名自学成才的程序员,所以如果这是一个众所周知的问题并有一个众所周知的解决方案,请原谅。
谢谢!
【问题讨论】:
我是嵌入式应用程序的编程爱好者。该应用程序需要速度。我想确定某个变量(称为“X”)是否超过了另一个变量(称为“Z”)的某个百分比(称为“Y”)。
X、Y 和 Z 都可以在运行时更改。由于我需要速度,因此我想使用整数数学而不是浮点数来执行此操作,这会导致速度损失。
这样做有什么技巧吗?我是一名自学成才的程序员,所以如果这是一个众所周知的问题并有一个众所周知的解决方案,请原谅。
谢谢!
【问题讨论】:
所以你想要测试1*X > Z*Y,没有什么能阻止你这样做,只需将1(因此100%)定义为10^decPlaces,其中decPlaces>=2(否则你将没有足够的精度做百分比为ints
如果您需要计算正确到 4 d.p. if X = 10 then X_fixed_precision = 100000 if Y is 30% (0.3) then Y_fixed_precision=3000 and if Z=10000 then z_fixed_precision=100000000 这个技巧称为固定精度算术...
如果您想要更好的性能,请使用 2 而不是 10 的幂(这很难准确地转换成小数位数,但应该会更快一些)
例如你的代码可能看起来像
if (ONE_FIXED_PRECISION * X_fixed_precision > Z_fixed_precision * Y_fixed_precision)
// Do something
在哪里FOO_fixed_precision = FOO * ONE_FIXED_PRECISION
请注意确保不会出现整数溢出 - X * ONE_FIXED_POINT * ONE_FIXED_POINT 的最大值必须小于可以存储在一个字中的最大值(如果您使用更长的整数类型,则为双字)
【讨论】:
100*(331/33) = 1000 不严格大于10*100=1000 而331*100 > 1000*33