gpt4 book ai didi

floating-point - 想要使用整数数学将 int 缩放为 int

转载 作者:行者123 更新时间:2023-12-04 08:28:46 25 4
gpt4 key购买 nike

我使用的是 SDCC 2.8.0,因此内存和代码大小非常有限。假设我有一个介于 0 和 127 之间的输入值,我想将其缩放到 20 - 100。通常我会这样做:

int scale(int input, int min, int max)
{
// assuming max is always greater than min
float range = (float)max - (float)min;
int output = min + int((range / 127.f) * (float)input);
return output;
}

调用 scale(64, 20, 100);我得到 60,正好是 20 和 100 之间的一半。

如何在不使用浮点数的情况下做到这一点?任何位移魔法?

最佳答案

(max-min)<(INT_MAX/127)那么你可以天真地乘以(max-min)*input分割前/127否则,您必须分解操作以避免溢出和未定义的行为......

在后一种情况下,一种天真的可能性是将两个乘数除以 127。

A=Q1*127+R1
B=Q2*127+R2
A*B = (Q1*Q2*127 + Q1*R2 + Q2*R1) * 127 + R1*R2
(A*B)/127 = Q1*Q2*127 + Q1*R2 + Q2*R1 + (R1*R2/127)

或在 C:
unsigned int range=max-min;
unsigned int output = min
+ (range/127)*(input/127)*127
+ (range/127)*(input%127)
+ (range%127)*(input/127)
+ (range%127)*(input%127) / 127;

很确定有更有效的位移公式 >>8 ,编译器可能已经做得很好,但可能没有那么好,我们可能会更好地帮助他:
A=Q1*128+R1
B= 0*128+R2 (because B<=127)
A*B = (Q1*R2) * (127+1) + R1*R2
(A*B)/127 = Q1*R2 + (Q1*R2 + R1*R2)/127

在 C 中:
编辑
咳咳,我的意图是除以 128,即 >>7,我错误地写了 >>8 相同的余数,应该是 &0x7F 而不是 &0xFF
不那么晦涩,只写/128 和 %128 当然更好,因为我们现在可以相信编译器将这些操作转换为简单的位操作......
unsigned int range=max-min;
unsigned int high=(range / 128)*input;
unsigned int low =(range % 128)*input;
unsigned int output = min + high + (high+low)/127;

编辑2
为了更好地平衡分布,我们可能会应用某种舍入而不是截断,如下所示:
unsigned int output = min + high + (high+low+63)/127;

关于floating-point - 想要使用整数数学将 int 缩放为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412754/

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