1

我对编程比较陌生,而且数学一直很糟糕。我有一个带 16 位符号的程序INT -32,768 +32,768我想将这些值表示为1-100正面和-1 - -100负面,以便它们更容易使用。所以基本上 100 等于 32,768;50 等于 16,384;等等。我怎样才能轻松地做到这一点?我正在用 C 编程,尽管我认为这更像是一个数学问题。

4

4 回答 4

2

您的要求似乎很奇怪,因为如果您尝试制作整数,那么您可以在 16 位整数值(通常是 a short)中使用范围 [-100, 100] 并且......好吧,就这样吧。

如果您还希望它包含十进制值,那么您需要考虑它无法以非常好的方式表示 [-100, 100] 的范围......如果您要求存储来自另一个 16 位整数值的 16 位整数值,你可以这样做它会非常混乱:

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

但是,您正在失去精度,并且在某些值范围内存在混叠,因此这似乎不太好。如果您可以存储 afloat或 a double,或者可以更好地保存值 [-100, 100] :

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

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

编辑:

作为最后的建议,我会说,除非您的程序的另一部分要求 100 -> -100,否则如果您正在使用floatdouble使用范围 [-1.0, 1.0],那么使用范围会无限好,并且可以更强大当做诸如缩放数字之类的事情时,进入其他输入和输出,包括将进入服务器的原始整数值。(INT16)(0.75 * MAX_MOTOR_VALUE) 比使用 100 到 -100 的方法要好得多。

于 2013-04-15T02:54:30.537 回答
1

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

这是你可以做的:

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

int fixed2int(int x)
{
  return x * 100LL / 32767;
}
于 2013-04-15T02:54:06.217 回答
0

将其除以最大值,乘以 100,然后截断为整数。例如(将最大值除和乘以 100 为 1 步):

int normalize(int a)
{
    assert(a >= -32768 && a <= 32767)
    return (int)ceil(a / 327.68);
}
于 2013-04-15T02:53:34.400 回答
0

她忘记了所有答案,我们需要将结果平均分布在 1..100 之间。而这些答案永远不会达到 100。

int normalize(int a)
{

    return (int)(a*101L/ 32769);
}
于 2013-04-15T10:00:36.997 回答