2016-09-21 54 views
0

作爲作業的一部分,我正在編寫一個程序,它將一個浮點十進制數作爲從終端輸入的輸入,並返回該數字的IEEE754 binary32 AND如果該二進制正好表示該數字,則返回1否則爲0。我們只允許使用iostream和cmath。binary32舍入誤差

我已經寫了部分返回binary32格式,但我不明白如何查看是否舍入到該格式。

我的想法看到舍入是從binary32窗體計算出十進制數並將其與原始數字進行比較。但是我將保存返回的binary32作爲某些類型的數據存在困難,因爲我無法使用vector標頭。我試過使用循環和pow,但我仍然得到索引錯誤。

此外,我很難理解究竟是什麼df*df?我自己寫了代碼,但我只知道我需要將指向float的地址轉換爲指向char的地址。

我其他的想法是比較binary32二進制64,這提供了更多的精度。而且,我不知道如何在不使用矢量的情況下做到這一點?

int main(int argc, char* argv[]){ 
    int i ,j; 
    float num; 

    num = atof(argv[1]); 

    char* numf = (char*)(&num); 

    for (i = sizeof(float) - 1; i >= 0; i--){ 
     for (j = 7; j >= 0; j--) 
      if (numf[i] & (1 << j)) { 
       cout << "1"; 
      }else{ 
       cout << "0"; 
      } 
    } 
    cout << endl; 
} 

////// 更新: 由於有周圍沒有其他辦法,而無需使用頭文件,我硬編碼的for循環來binary32轉換回小數。

由於x = 1.b31b30 ... b0 * 2^p。一個用於尋找指數的循環和一個用於尋找有效數的循環。

+0

一些建議:1.您可能需要確保您的系統在沉沒太多時間調試之前使用IEEE754浮點數。 2. [熟悉endian](https://en.wikipedia.org/wiki/Endianness)。全心全意推薦更好的名字。 'd'完全不具描述性。它沒有提示'd'的目的。這通常會減慢調試速度。 – user4581301

+0

'df'是一個指向'char'的指針。 '* df'是它當前指向的'char'。你可以使用char指針來假裝一些較大的對象是由字符組成的。 –

+0

@ user4581301是的我同意我需要更好的描述性名稱。 –

回答

0

基本思路:將您的號碼d轉換回字符串(例如to_string),並將其與輸入進行比較。如果琴絃不同,由於float的限制,會有一些損失。

當然,這意味着您的輸入必須始終與to_string使用的字符串格式相同。無需額外的不必要的0,沒有空格等

...
這就是說,做不投浮充轉換(但有人工分析輸入和計算IEEE754位)是更多的工作initally,但作爲回報,它自動解決了這個問題。而且,正如評論中指出的那樣,你的演員表可能無法按照你想要的方式工作。

+2

我不確定'std :: to_string'可以工作。如果不能更改要顯示的小數位數,即使0.1不能完全表示爲浮點數,我也能夠精確地輸出0.1作爲輸入。 –

+0

對吧,我忘了Rounding/Dragon/Grisu ...然後,硬解(用數字陣列等構建手動計算)似乎是唯一的方法。 – deviantfan

+0

感謝您的建議!雜亂的部分是索引,但我終於明白了for循環。 –