【问题标题】:Looking for good substitute for calculating percentage employing integer math寻找使用整数数学计算百分比的良好替代品
【发布时间】:2010-11-17 05:22:01
【问题描述】:

我是嵌入式应用程序的编程爱好者。该应用程序需要速度。我想确定某个变量(称为“X”)是否超过了另一个变量(称为“Z”)的某个百分比(称为“Y”)。

X、Y 和 Z 都可以在运行时更改。由于我需要速度,因此我想使用整数数学而不是浮点数来执行此操作,这会导致速度损失。

这样做有什么技巧吗?我是一名自学成才的程序员,所以如果这是一个众所周知的问题并有一个众所周知的解决方案,请原谅。

谢谢!

【问题讨论】:

    标签: math integer precision


    【解决方案1】:

    所以你想要测试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*x/y > z 而不是 100*x > z*y?
    • 因为那是我在脑海中计算数学的方式......(自从我实际上不得不使用这种技术以来已经有一段时间了)我会编辑,纯乘法更准确
    • 宾果游戏!感谢您帮助一个真正的新手。如果你想知道你帮我做了什么,我正在尝试制作一个类似于你可以在 youtube 上看到的硬盘时钟的螺旋桨时钟。感谢您的帮助!
    • 难道不是在某些语言中您也可以使用像 100*(x/y) > z 这样的括号来防止溢出吗?也许甚至不需要使用括号。
    • 如果您先进行除法,那么您将失去精度 - 如果 x 为 3.31,y 为 33%,z 为 10,并且您使用 100 作为您的固定精度乘数,则测试应该返回正确,但使用整数除法,100*(331/33) = 1000 不严格大于10*100=1000331*100 > 1000*33
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多