gpt4 book ai didi

C 编程类型转换和定点

转载 作者:行者123 更新时间:2023-11-30 19:35:39 25 4
gpt4 key购买 nike

如何用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com