首页 分享 浮点数0.5f的偶数舍入运算实现

浮点数0.5f的偶数舍入运算实现

来源:花匠小妙招 时间:2024-12-03 05:28

深入理解计算机系统 家庭作业 2.93

最新推荐文章于 2021-05-18 00:34:48 发布

fengjingge 于 2014-04-28 13:07:05 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

实现浮点数 0.5f,运行成功,特别是要注意舍入运算,是偶数舍入!

#include <stdio.h>
typedef unsigned float_bits;

typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start,int len)
{
    int i;
    for(i = 0;i < len;i++)
    {
        printf(" %.2x",start[i]);
    }
    printf("n");
}

void show_float(float x)
{
    show_bytes((byte_pointer) &x,sizeof(float));
}

float_bits float_half(float_bits f)
{
        unsigned sign = f>>31;
        unsigned exp = f>>23&0xff;
        unsigned frac = f&0x7fffff;
        if(exp == 0xff)
                return f;
        if(exp == 0)
    {
        if ((frac & 0x00000001) == 1)
            {
                if ((frac & 0x00000002) == 0x00000002)
                    frac = (frac + 1) >> 1;
                else
                    frac = frac >> 1;
            }
        else
            {
                frac = frac >> 1;
            }    
    }
        if(exp == 1)
        {
                exp = exp - 1;
                 if ((frac & 0x00000001) == 1)
                          {
                                  if ((frac & 0x00000002) == 0x00000002)
                                          frac = (frac + 1) >> 1;
                                  else
                                          frac = frac >> 1;
                          }
                  else    
                          {       
                                  frac = frac >> 1;
                          }
                frac = frac + (1 << 22);
        }
        if(exp > 1)
        {
                exp = exp - 1;
        }
        return (sign<<31) | (exp<<23) | frac;
}
int main()
{

    unsigned u,ur;
    float f,fr;

    for(u=8388607;u<=0x0fffffffu;u++)
    {
        f =*((float *)&u);
        f=f*0.5;
        ur = float_half(u);
        fr = *((float *)&ur);
        if(fr == f)
            printf("%u: %x %x okn",u,f,fr);
        else
        {
            printf("%u: errorn",u);
        printf("the f is n");
        show_float(f);
        printf("th fr is %n");
        show_float(fr);
            printf("%x %xn",f,fr);
            return -1;  
        }
     }
    return 0;
}

相关知识

c语言中%运算符的运算对象,C语言中运算对象必须是整型的运算符是()。A.%=B./C.=D.......
0.5f==0.5 0.3f==0.3
N点DFT,用FFT快速算法实现。.ppt
在运算指令中,形式为#i=ASIN[#j]的函数表示的意义是(   &
c语言实现玫瑰花(代码)
位运算
【Python】(二)数据类型与转换
js中的0.1+0.2!==0.3
特殊的数独身数,:水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗七星数, 八仙数, 九九重阳数 ,十全十美数...
SVM实现鸢尾花分类

网址: 浮点数0.5f的偶数舍入运算实现 https://www.huajiangbk.com/newsview837388.html

所属分类:花卉
上一篇: 祝福家庭美满的话语180句
下一篇: 祝哥哥嫂子乔迁之喜贺词(精选65

推荐分享