• 计算机系统基础实验——数据的机器级表示(计算浮点数 f 的绝对值[f])


    题目要求:

    这个函数计算浮点数f的绝对值[f]。如果f是NaN,函数应该简单的返回f。
    Unsigned float_abs (unsiged f)
    {
    /**************/
    return/*******/;
    }

     先分析题目,题目有两个要求:

    1.判断f是否是NAN类型,如果是返回f。

    2.如果不是NAN类型,返回f的绝对值。

    首先来了解一下浮点数在内存中的储存方式:

    什么是NAN类型?

    NaN(NotaNumber,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。

    知道了什么是NAN,那该如何判断一个浮点数是NAN类型?

    对于浮点数来说,阶码的每个二进制位全为1并且尾数不全为0即为NAN类型。

    顺便提一下,阶码的每个二进制位全为1并且尾数全为0为INF类型。

    对于float类型来说,我们只用把他左移1位然后右移24位就能得到他的阶码,用代码表示即为(f<<1)>>24

    NAN类型的阶码全为1,0xFF(或0x7fffffff)也全为1,所以我们将NAN的阶码与0xFF进行与(&)运算得到的结果也全为1,即NAN类型与0xFF与运算后结果仍然为0xFF,所以我们可以通过((f<<1)>>24)&0xFF结果是否为0xFF来判断他是否为NAN类型。

    ps:与运算(&):  x&1=x x&0=0 与1&结果为原来的数,与0&结果为0。

    如果不是NAN类型那如何返回f的绝对值呢?

    float的符号位在最左边 所以我们只需要将f左移一位然后右移一位就可以将符号位变为0代码表示即为(f<<1)>>1。

    最后float类型不能进行位运算,所以我们要将float进行强制类型转化为unsigned类型位运算后再强制类型转换为float类型输出。

    最终位运算代码如下:

     运行结果:

  • 相关阅读:
    指数移动平均EMA
    从零开始Blazor Server(3)--添加cookie授权
    Django 里如何使用 sqlite (操作步骤)
    分析-ConfigurationClassPostProcessor原理
    【Vue】详细介绍下Vue中v-for的使用方法
    45、Flink 的 Process Function 详解
    SpringBoot中的Environment
    Mybatis框架
    一文总览 Alameda Research 的投资版图:公链、DeFi、NFT 等多领域四面出击
    四、java版 SpringCloud分布式微服务云架构之Java 对象和类
  • 原文地址:https://blog.csdn.net/haoranyyy/article/details/128160465