我得到錯誤的值,同時將浮到無符號整數四捨五入問題,而CONVER浮到無符號短
TMAC_PAYLOAD_SCALE = 0.10
Data = (unsigned short)(mData/TMAC_PAYLOAD_SCALE);
189.20/0.10 = 1891 (I am expecting 1892)
184.59/0.10 = 1845 (I am expecting 1846)
試圖用圓形和小區功能,但仍然得到錯誤的答案
我得到錯誤的值,同時將浮到無符號整數四捨五入問題,而CONVER浮到無符號短
TMAC_PAYLOAD_SCALE = 0.10
Data = (unsigned short)(mData/TMAC_PAYLOAD_SCALE);
189.20/0.10 = 1891 (I am expecting 1892)
184.59/0.10 = 1845 (I am expecting 1846)
試圖用圓形和小區功能,但仍然得到錯誤的答案
如果C++編譯器uses IEEE 754你可以嘗試round功能:
Data = (unsigned short)round(mData/TMAC_PAYLOAD_SCALE);
但是,假設除法的結果是不可否定的,下面的AP proach可能更好:
Data = (unsigned short)(mData/TMAC_PAYLOAD_SCALE + 0.5);
原因是,對於浮點積分轉換,小數部分只是被丟棄。因此,如果舍入函數不能表示準確的整數值N
,並且返回的值「略小於」N
,則在投射後我們會得到N-1
。
int a = 16777217;
float f = a; // not double
int b = f;
cout << a << " " << b << endl;
其輸出
16777217 16777216
儘管所描述的問題不應在IEEE 754和round
功能的情況下發生:
這個問題可以通過以下的(IEEE 754兼容)代碼來說明(因爲round
返回double
,它允許精確表示整數),但第一種方法看起來不太方便,因爲我們必須牢記所有這些假設。
我有什麼tried-
#include <stdio.h>
#include<math.h>
int main()
{
printf("%hd\n",(unsigned short)ceil(189.20/0.10)); // you can use ceilf also
printf("%hd\n",(unsigned short)floor(184.59/0.10));
return 0;
}
輸出 -
[email protected]:~/My Docs/Programs# ./a.out
1892
1845
'round'應給予正確的結果 - 你確定你正確使用它? – 2014-09-02 11:01:24
[看起來不錯](http://coliru.stacked-crooked.com/a/73b541ddbfdab551)(我第一次使用了圓形,但第二次使用時也是這樣)。在第一種情況下需要循環只是由於浮點計算的樂趣所致:10.0 * 189.20爲您提供了正確的答案。在第二種情況下,這是因爲一個演員以某種方式截斷數據,因此1845.9變爲1845. – Nelfeal 2014-09-02 11:09:34
@PaulR在VC的情況下是。但一般來說,'double'類型(由'round'返回)不能保證是IEEE 754,並且允許所有整數都有_exact_表示。因此,我們可能會在截斷結果後發生的情況比預期的要少。 (我試圖用我的答案中的「float」來說明它。) – AlexD 2014-09-06 22:30:48