将16位signed int表示为0-100之间的值

时间:2013-04-15 02:45:37

标签: c math

我对编程比较陌生,而且数学一直很糟糕。我有一个16位签名INT -32,768 +32,768的程序我想在正面表示这些值为1-100,在负面表示-1 - -100这样的值更容易使用。所以基本上100将等于32,768; 50将等于16,384;我怎样才能轻松实现这一目标?我在C编程虽然我认为这不是一个数学问题而是任何事情。

4 个答案:

答案 0 :(得分:2)

你的要求看起来很奇怪,因为如果你试图制作整数而不是你可以在16位整数值(通常是short)中使用范围[-100,100]并且......好吧,就这样吧。

如果你也在寻找它包含 decimal 值,那么你需要考虑它不能以非常好的方式表示[-100,100]的范围...如果你要求从另一个16位整数值存储一个16位整数值,你可以这样做它只是非常混乱:

int16_t normalized = ( rawvalue / 327 ); // <--- scaled, rawvalue is int16_t

你正在失去精确度,并且在某些范围的值上存在锯齿,所以这看起来不太好......如果您可以存储floatdouble,则可以更好地保存值[-100,100]:

double normalized = ( rawvalue * ( 32768.0 / 100.0 ) );
// float normalized = /*... */ Append "f" for "float" math instead on those constants

你的要求似乎......很奇怪,但这就是你要做的。祝你好运!

编辑:

作为最终推荐,我会说,除非你的另一部分需要100 - &gt; -100,如果你正在使用floatdouble使用范围[-1.0,1.0] 无限更好的工作,并且可以做得更强大比如缩放数字等进入其他输入和输出的东西,包括将进入服务器的原始整数值。 (INT16)(0.75 * MAX_MOTOR_VALUE)比100到-100更好。

答案 1 :(得分:1)

16位整数最多只能有2个 16 = 65536个不同的值,从-32767到+32767(在非二进制补码表示中)或从-32768到+32767(在二进制补码表示中)。所以,你真的希望32767等于100,而-32767等于-100。

以下是您可以做的事情:

int int2fixed(int x)
{
  return x * 32767LL / 100;
}

int fixed2int(int x)
{
  return x * 100LL / 32767;
}

答案 2 :(得分:0)

除以最大值,乘以100,并截断为整数。例如(将最大值除法乘以100乘以1步):

int normalize(int a)
{
    assert(a >= -32768 && a <= 32767)
    return (int)ceil(a / 327.68);
}

答案 3 :(得分:0)

她忘记的所有答案,我们需要在1..100之间传播结果。这些答案永远不会达到100。

int normalize(int a)
{

    return (int)(a*101L/ 32769);
}