c++ - 浮點數轉整數四捨五入 - 福點數轉換




將浮點數轉換為固定點 (4)

在C ++中,將任何浮點值(float)轉換為固定點 (int,16:16或24:8)的通用方法是什麼?

編輯:澄清,定點值有兩個部分:整數部分和小數部分。 整數部分可以用有符號或無符號整數數據類型表示。 小數部分由無符號數據整數數據類型表示。

為了清楚起見,我們用錢來比喻一下。 小數部分可能代表美分 - 美元的一小部分。 “美分”數據類型的範圍是0到99.如果8位無符號整數用於定點數學,則小數部分將被分成256個可均勻分割的部分。

我希望能夠解決這個問題。


****編輯**: 我的第一個評論適用於凱文的編輯之前,但我將留在這里為後代。 答案在這裡很快就會改變!

凱文的做法的問題是,固定點你通常打包到一個保證字大小(通常32位)。 分別聲明這兩個部分將使您意識到編譯器結構打包的奇思妙想。 是的,你可以強制它,但它不適用於16:16以外的任何表示。

KPexEA更接近標準,將所有內容整合到int中 - 雖然我會使用“signed long”來試圖在32位上明確表示。 然後你可以使用他的方法來生成定點值,並且位分片再次提取組成部分。 他的建議也包括24:8的情況。

(其他人誰建議static_cast .....你在想什麼?))


在C ++中沒有任何固定點編號的內置支持。 你最好的選擇是寫一個包裝“FixedInt”的類,把雙打和轉換。

至於通用的方法來轉換... int部分是很容易的,只是抓住值的整數部分,並將其存儲在高位...小數部分將是沿線的東西:

for (int i = 1; i <= precision; i++)
{
   if (decimal_part > 1.f/(float)(i + 1)
   {
      decimal_part -= 1.f/(float)(i + 1);
      fixint_value |= (1 << precision - i);
   }
}

儘管這可能仍然包含錯誤


這對於從浮點轉換為整數很好,但是OP也需要固定點

現在你怎麼用C ++來做這件事,我不知道(C ++不是我能想到的東西)。 也許嘗試一個縮放整數的方法,即使用一個32位或64位整數,並以編程方式分配最後,比如說,小數點右側的6位數字。


我給了那個寫出最好答案的人的答案,但我真的使用了一個相關的問題代碼。

它使用了模板,很容易依賴於boost lib。





fixed-point