作爲作業的一部分,我正在編寫一個程序,它將一個浮點十進制數作爲從終端輸入的輸入,並返回該數字的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。一個用於尋找指數的循環和一個用於尋找有效數的循環。
一些建議:1.您可能需要確保您的系統在沉沒太多時間調試之前使用IEEE754浮點數。 2. [熟悉endian](https://en.wikipedia.org/wiki/Endianness)。全心全意推薦更好的名字。 'd'完全不具描述性。它沒有提示'd'的目的。這通常會減慢調試速度。 – user4581301
'df'是一個指向'char'的指針。 '* df'是它當前指向的'char'。你可以使用char指針來假裝一些較大的對象是由字符組成的。 –
@ user4581301是的我同意我需要更好的描述性名稱。 –