我對編程相對比較陌生,數學一直很糟糕。我有一個程序,需要16位有符號INT
-32,768 +32,768
我想在積極的一面代表這些值爲1-100
,而在消極的一面-1 - -100
,以便他們更容易使用。所以基本上100就等於32,768; 50將等於16,384;等等。我怎樣才能輕鬆完成這件事?我在C編程,但我認爲這是一個數學問題而不是任何事情。代表16位有符號整數作爲0-100之間的值
回答
你的要求看起來很奇怪,因爲如果你想使整數比,你可以只使用範圍爲[-100,100]在16位整數價值(通常爲short
)和......好吧,就這樣吧。
如果你也在尋找它含有十進制值,那麼你就需要考慮,這將不能夠代表一個很好的方式,從[-100,100]範圍內的...如果你問到存儲從其他16位整數值的16位整數值,你可以做,這將只是非常凌亂:
int16_t normalized = (rawvalue/327); // <--- scaled, rawvalue is int16_t
你失去精度,還有的混疊在一定範圍內儘管如此,這似乎並不是很好。如果你可以存儲float
或double
,無論是或能夠保存的值[-100,100]一點點很好:
double normalized = (rawvalue * (32768.0/100.0));
// float normalized = /*... */ Append "f" for "float" math instead on those constants
你的要求似乎......奇怪,但這是你會怎麼做。祝你好運!
編輯:
作爲最後一個建議,我會說,除非另一塊程序的需求100 - 如果你正在使用float
或double
使用範圍爲[-1.0,1.0]> -100,是無限制地使用更適合使用,並且在進行縮放數字等操作時可以更加強大,並且可以進入其他輸入和輸出,包括將進入服務器的原始整數值。 (INT16)(0.75 * MAX_MOTOR_VALUE)要比100到-100更好。
在現代C中,整數除法將[-326,326]全部映射爲0.這是數字的兩倍,比映射爲-1或1. –
是的,這就是爲什麼將視覺作爲int16,最好用浮點數來做,或者使用一個特殊的「round」函數(無論如何可能使用浮點數)。 – 2013-04-15 05:46:05
這就是... ...正是我上面做的。您只是無故添加額外的條件檢查。什麼...? – 2013-04-15 06:12:35
將其除以最大值,乘以100並截斷爲整數。例如(組合最大值除法和乘法由100到1步):
int normalize(int a)
{
assert(a >= -32768 && a <= 32767)
return (int)ceil(a/327.68);
}
如果整數是16位,那麼32768將溢出。 –
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;
}
她的所有答案都忘記了,我們需要在1..100之間大致平均分佈結果。而這些答案永遠不會達到100.
int normalize(int a)
{
return (int)(a*101L/ 32769);
}
- 1. 無符號16位和64位整數
- 2. 16位無符號整數(uint16_t)
- 3. Qt QByteArrays + 16位無符號整數
- 4. 將Java int的底部16位作爲帶符號的16位值獲取
- 5. 將16位帶符號的PCM轉換爲帶有符號的16位
- 6. 將無符號16位int轉換爲C#中有符號16位int int#
- 7. 有符號整數的按位操作
- 8. 使用char作爲Java中的無符號16位值?
- 9. 將原始14位二進制補碼轉換爲有符號16位整數
- 10. 用兩個無符號的16位整數表示一個無符號的32位值
- 11. 學位符號的UTF 16代碼
- 12. 從BitArray轉換爲16位無符號整數在C#
- 13. 從2個16位有符號字節獲取帶符號整數?
- 14. 將帶符號的13位值轉換爲帶符號的16位
- 15. 5位有符號整數?
- 16. 「帶符號和無符號整數表達式之間的比較」只帶有無符號整數
- 17. Winsock2.h:FD_SET:有符號和無符號整數表達式之間的比較
- 18. 警告:有符號和無符號整數表達式之間的比較
- 19. 有符號和無符號整數表達式之間的C++比較
- 20. 存儲在一個無符號的16位整數的RGB
- 21. 在無符號整數和有符號整數之間進行C++轉換
- 22. 無符號整數16位小尾數到Python變量
- 23. C#Marshal.Copy Intptr到16位管理無符號整數數組
- 24. 在Clojure中的無符號16位整數
- 25. 如何從QFile讀取帶符號的16位整數?
- 26. cuda 16位整數
- 27. 將n位整數從無符號轉換爲有符號
- 28. 符號擴展到16位
- 29. 信號變爲0X00從0100
- 30. 將16位整數無符號數字轉換爲表示十六進制數字的ASCII字符串
你知道一些信息會丟失,對不對? – nhahtdh
它不一定是完美的 – Yamaha32088
它確實取決於你試圖用你的映射實現什麼,因爲沒有Z_p - > Z_q的內射映射,其中q> p。 – RageD