吉文斯:
讓我們假設1 < = C < = 120,
原始等式:0.02035 * C * C - 2.4038 * C
然後-70.98586 < F(c)中< 4.585
- >-71 <= result <= 5
將f(c)舍入到最近的int32_t
。
參數A = 0.02035和B = 2.4038
A & B可能會隨後編譯發生變化,但不會在運行時發生變化。
允許編碼器輸入值,如0.02035 & 2.4038。這裏顯示的關鍵部分以及其他人將它按比例縮放0.02035等因子,使其等於(2)的等式(簡化爲形式(A * c-B)* c)並縮放結果。
重要特徵:
1當確定A和B,確保了編譯時間浮點乘法和經由圓而不是截斷髮生最終轉化率。積極的價值觀,+ 0.5
達到這一點。如果沒有四捨五入的答案,UD_A*UD_Scaling
最終可能會達到一個整數,並截斷0.999999,當轉換爲int32_t
時
2在運行時,我們沒有進行昂貴的除法操作,而是執行>>(右移)。通過加上除數的一半(正如@Joe Hass所建議的那樣),在分組之前,我們得到了一個很好的四捨五入的答案。重要的是而不是來編碼在/
這裏some_signed_int/4
和some_signed_int >> 2
不以同樣的方式。隨着2的補,>>
截斷向INT_MIN
而/
截斷向0
#define UD_A (0.02035)
#define UD_B (2.4038)
#define UD_Shift (24)
#define UD_Scaling ((int32_t) 1 << UD_Shift)
#define UD_ScA ((int32_t) (UD_A*UD_Scaling + 0.5))
#define UD_ScB ((int32_t) (UD_B*UD_Scaling + 0.5))
for (int32_t val = 1; val <= 120; val++) {
int32_t result = ((UD_A*val - UD_B)*val + UD_Scaling/2) >> UD_Shift;
printf("%" PRId32 "%" PRId32 "\n", val, result);
}
例不同之處:
val, OP equation, OP code, This code
1, -2.38345, -3, -2
54, -70.46460, -71, -70
120, 4.58400, 4, 5
這是一個新的答案。我的舊+1回覆已刪除。
你最長的整數有多長?你對輸入「c」有最大值嗎?我想判斷你可以使用多少位。 –
我將使用的最大值是120(對於C)。整數可以是32位長。 –
你想要什麼精度?你所做的計算基本上把一個相當精確的定點值轉換爲一個整數,並且整數的最大可能值只是4. – 2014-01-17 17:45:55