IEEE 754位操作舍入错误

库尔特·普莱斯(Kurt Price)

在不使用类型转换或库功能的情况下,必须使用位操作将整数转换为浮点型。下面是我当前正在处理的代码。它基于我在C中某些整数上使用位操作中断Cast Integer to Float中找到的代码我遇到的问题涉及IEEE 754中的四舍五入标准。更具体地说,我的代码四舍五入为0,但是应该四舍五入为偶数。我需要进行哪些更改?

unsigned inttofloat(int x) {
    int bias = 127;
    int man;
    int exp = bias + 31; //8-bit exp
    int count = 0;
    int tmin = 1 << 31;
    int manpattern = 0x7FFFFF;

    int sign = 0;

    if (x == 0){
        return 0;
    }
    else if (x == tmin){
        return 0xcf << 24;
    }

    if (x < 0) {
        sign = tmin;
        x = ~x + 1; // makes x negative so that we can accurately represent it later on.
    }

    while((x & tmin) == 0){
        exp--;
        x <<= 1;
        count++;
    }

    exp <<= 23;
    man = (x >> 8) & manpattern;

    return (sign | exp | man);
}
chux-恢复莫妮卡

舍入到最接近的值-平整关系,请替换(x >> 8)为:

unsigned u = x;  // avoid any potential signed shifting issues
unsigned lease_significant_bit = (u >> 8) & 1;
unsigned round_bit = (u >> 7) & 1; // Most significant bit shifted out
unsigned sticky_bit_flag = !!(u & 0x7F);  // All other bits shifts out

// OP's shifted answer.
u = (u >> 8): 

// round away if more than half-way or
//  if at half-way and number is odd
u += (round_bit & sticky_bit_flag) | (round_bit & lease_significant_bit);

留给OP简化


请注意,它u += 1可能会一直传播,并且需要指数增加。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IEEE 754 / iec 559

来自分类Dev

IEEE 754乘法小数

来自分类Dev

IEEE 754到小数

来自分类Dev

IEEE-754 蟒蛇

来自分类Dev

IEEE舍入方案

来自分类Dev

IEEE754浮点数最通用的舍入算法

来自分类Dev

使用最近的舍入从IEEE-754转换为定点

来自分类Dev

IEEE754浮点数最通用的舍入算法

来自分类Dev

对IEEE 754的理解有问题

来自分类Dev

IEEE浮点数舍入

来自分类Dev

在JavaScript中将IEEE 754从位流转换为float

来自分类Dev

在JavaScript中将IEEE 754从位流转换为float

来自分类Dev

IEEE 754浮点除法的可逆性

来自分类Dev

在C ++中浮动比IEEE 754的范围更小

来自分类Dev

如何检查IEEE754溢出范围

来自分类Dev

Java中的0.0和-0.0(IEEE 754)

来自分类Dev

为什么需要IEEE 754余数?

来自分类Dev

在GDB中显示IEEE 754浮点表示?

来自分类Dev

IEEE754的C ++静态断言

来自分类Dev

与IEEE-754相比,内存中的浮点位模式逐位反转了?

来自分类Dev

有什么办法可以看到它的64位浮点IEEE754表示形式中的数字

来自分类Dev

如何将按位运算应用于JS数字的实际IEEE 754表示形式?

来自分类Dev

vb.net中的IEEE754半精度(16位)浮点数据

来自分类Dev

为什么IEEE754单精度浮点数只有7位精度?

来自分类Dev

如何检查是否使用了IEEE 754单精度(32位)浮点表示形式?

来自分类Dev

用C解释32位无符号长为单精度IEEE-754浮点型

来自分类Dev

如何将按位运算应用于JS数字的实际IEEE 754表示形式?

来自分类Dev

浮点到 IEEE-754 拆分为两个 16 位字

来自分类Dev

将IEEE-754双精度和单精度转换为十进制Java错误