2016-05-13 60 views
0

假設我有一個值乘以91,875並使用Round to even(又名銀行家舍入)四捨五入的值的列表。以下是前20個倍數:如何選擇正確的倍數?

0   0 
91,875  92 
183,75  184 
275,625  276 
367,5  368 
459,375  459 
551,25  551 
643,125  643 
735   735 
826,875  827 
918,75  919 
1010,625 1011 
1102,5  1102 
1194,375 1194 
1286,25  1286 
1378,125 1378 
1470  1470 
1561,875 1562 
1653,75  1654 
1745,625 1746 

假設在這些值之間,我的系統接收其他值。我需要檢查其中哪些是我的原始91,875步驟的多個,哪些不是。

例子。從列表我:

3583 (before rounding it was 91,875 * 39 = 3583,125) 
3584 
在這種情況下

,我知道,選擇值僅爲3583,因爲:

lrint(91,875 * 39) = 3583 

並放棄3584,這只是在3583和之間的值下一步:

lrint(91,875 * 39) = 3583 
lrint(91,875 * 40) = 3675 

我該如何選擇它?當我得到這些值時,我沒有3940。我試着:

int times = round(currentSample/samplesPerPulse); 
double diff = abs(samplesPerPulse * times - currentSample); 

if (diff < 1) { 
    ... do somethings 
} 

其中currentSample是3583和3584和samplesPerPulse 91875,但即使3584 diff低於1

+0

爲什麼不是你把你懷疑的價值除以91,875,再乘以回合,並將結果與​​輸入進行比較? – GMichael

+0

@邁克爾:當我得到我的價值觀時,我沒有「39」和「40」,所以我不知道「我應該增加多少」! – markzzz

+3

lrint(floor(input/91875)* 91875)== input? (打印(輸入/ 91875)* 91875)==輸入? – GMichael

回答

1

請嘗試以下方法:

if((lrint(floor(currentSample/samplesPerPulse) * samplesPerPulse) == currentSample) or 
    (lrint(ceil(currentSample/samplesPerPulse) * samplesPerPulse) == currentSample) 
) 
{ 
    .... do something 
}