- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何用 C 代码实现这个函数?
U16 newValue function(U16 value, S16 x, U16 y){
newValue = min((((value - x) * y) >> 10) >> 4, 4095)
return newValue
}
y 是具有 10 个小数位的定点
如果 x 大于该值,则最终结果应为 0。
我担心的是不同类型之间的混合,尤其是不会发生溢出。还有如何干净地编写它,为什么会有很多类型转换。
最佳答案
您需要为输入中给出的参数的所有可能值编写函数代码。采用表达式(value - x)
。如果 value
等于 2^16 并且 x
等于 2^(-15),则 (value - x)
的结果将为 98304,比 U16
大。因此,在此操作之前我会将 value
转换为 S32
。
让我们将表达式 (value - x)
折叠为其最大值 98304。表达式 ((value - x) * y)
的最大值将为98304 * 2^16 等于 6442450944,这个值比 32 位整数所能容纳的还要大。因此,您需要将此表达式计算为 U64
。您只需将初始的 U32
转换替换为 S64
转换,因为无论如何您都需要它。
右位移位操作只会减少有效位的数量。因此,这不需要计算更多的位数。
min
调用确保结果不能大于 4095,可以保存在 U16
中;不需要更多的 Actor 。
最终功能:
uint16_t newValue(uint16_t value, int16_t x, uint16_t y){
int64_t newValue = (int64_t)(value);
newValue -= x;
newValue *= y;
newValue >>= 10;
newValue >>= 4;
newValue = min(newValue, 4095);
// Or as a one liner.
// uint64_t newValue = min(((((int64_t)value - x) * y) >> 10) >> 4, 4095);
return (uint16_t) newValue;
}
关于C 编程类型转换和定点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42377273/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!