2013-04-15 30 views
1

我對編程相對比較陌生,數學一直很糟糕。我有一個程序,需要16位有符號INT-32,768 +32,768我想在積極的一面代表這些值爲1-100,而在消極的一面-1 - -100,以便他們更容易使用。所以基本上100就等於32,768; 50將等於16,384;等等。我怎樣才能輕鬆完成這件事?我在C編程,但我認爲這是一個數學問題而不是任何事情。代表16位有符號整數作爲0-100之間的值

+0

你知道一些信息會丟失,對不對? – nhahtdh

+0

它不一定是完美的 – Yamaha32088

+0

它確實取決於你試圖用你的映射實現什麼,因爲沒有Z_p - > Z_q的內射映射,其中q> p。 – RageD

回答

2

你的要求看起來很奇怪,因爲如果你想使整數比,你可以只使用範圍爲[-100,100]在16位整數價值(通常爲short)和......好吧,就這樣吧。

如果你也在尋找它含有十進制值,那麼你就需要考慮,這將不能夠代表一個很好的方式,從[-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 - 如果你正在使用floatdouble使用範圍爲[-1.0,1.0]> -100,是無限制地使用更適合使用,並且在進行縮放數字等操作時可以更加強大,並且可以進入其他輸入和輸出,包括將進入服務器的原始整數值。 (INT16)(0.75 * MAX_MOTOR_VALUE)要比100到-100更好。

+0

在現代C中,整數除法將[-326,326]全部映射爲0.這是數字的兩倍,比映射爲-1或1. –

+0

是的,這就是爲什麼將視覺作爲int16,最好用浮點數來做,或者使用一個特殊的「round」函數(無論如何可能使用浮點數)。 – 2013-04-15 05:46:05

+0

這就是... ...正是我上面做的。您只是無故添加額外的條件檢查。什麼...? – 2013-04-15 06:12:35

0

將其除以最大值,乘以100並截斷爲整數。例如(組合最大值除法和乘法由100到1步):

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

如果整數是16位,那麼32768將溢出。 –

1

16位整數只能有2 = 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; 
} 
+0

在現代C語言中,這將兩倍於0的值映射到1或-1。 –

+0

@匿名請詳細說明一下? –

+0

錯! -32768到+32767 – Gangnus

0

她的所有答案都忘記了,我們需要在1..100之間大致平均分佈結果。而這些答案永遠不會達到100.

int normalize(int a) 
{ 

    return (int)(a*101L/ 32769); 
} 
相關問題