二进制32的舍入误差

时间:2016-09-21 22:13:26

标签: c++ pointers precision ieee-754

作为家庭作业的一部分,我正在编写一个程序,它将一个浮点十进制数作为从终端输入的输入,并返回该数字的IEEE754 binary32 并且如果二进制正好则返回1表示数字,否则为0。我们只允许使用iostream和cmath。

我已经编写了返回 binary32 格式的部分,但我不明白如何查看是否有这种格式。

我想看到舍入的想法是从 binary32 形式计算十进制数,并将其与原始数字进行比较。但是我很难将返回的binary32保存为某种类型的数据,因为我不能使用矢量头。我尝试过使用for循环和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。一个for循环用于查找指数,一个用于循环以查找有效数。

1 个答案:

答案 0 :(得分:0)

基本思路:将您的号码d转换回字符串(例如,使用to_string)并将其与输入进行比较。如果字符串不同,由于float的限制,会有一些损失。

当然,这意味着您的输入必须与to_string使用的字符串格式相同。没有额外的不需要的0,没有空格等。

...
也就是说,在没有强制转换的情况下进行浮点转换(但手动解析输入并计算IEEE754位)是最初的工作,但作为回报,它会自动解决这个问题。并且,如评论中所述,您的演员表可能无法按照您的意愿运作。