首页 > 编程语言 >C++浮点数半精度与单精度的相互转换

C++浮点数半精度与单精度的相互转换

时间:2024-09-18 17:05:06浏览次数:8  
标签:lsb exponent 单精度 mantissa 浮点数 unsigned C++ sign ret

代码

// 单精度转半精度
unsigned short cpu_float2half(float f)
{
    unsigned short ret;

    unsigned x = *((int*)(void*)(&f));
    unsigned u = (x & 0x7fffffff), remainder, shift, lsb, lsb_s1, lsb_m1;
    unsigned sign, exponent, mantissa;

    // Get rid of +NaN/-NaN case first.
    if (u > 0x7f800000) {
        ret = 0x7fffU;
        return ret;
    }
  
    sign = ((x >> 16) & 0x8000);
  
    // Get rid of +Inf/-Inf, +0/-0.
    if (u > 0x477fefff) {
        ret = sign | 0x7c00U;
        return ret;
    }
    if (u < 0x33000001) {
        ret = (sign | 0x0000);
        return ret;
    }

    exponent = ((u >> 23) & 0xff);
    mantissa = (u & 0x7fffff);

    if (exponent > 0x70) {
        shift = 13;
        exponent -= 0x70;
    } else {
        shift = 0x7e - exponent;
        exponent = 0;
        mantissa |= 0x800000;
    }
    lsb = (1 << shift);
    lsb_s1 = (lsb >> 1);
    lsb_m1 = (lsb - 1);
  
    // Round to nearest even.
    remainder = (mantissa & lsb_m1);
    mantissa >>= shift;
    if (remainder > lsb_s1 || (remainder == lsb_s1 && (mantissa & 0x1))) {
        ++mantissa;
        if (!(mantissa & 0x3ff)) {
            ++exponent;
            mantissa = 0;
        }
    }  

    ret = (sign | (exponent << 10) | mantissa);  

    return ret;
}

// 半精度转单精度
float cpu_half2float(unsigned short x)
{
    unsigned sign = ((x >> 15) & 1);
    unsigned exponent = ((x >> 10) & 0x1f);
    unsigned mantissa = ((x & 0x3ff) << 13);
    if (exponent == 0x1f) {  /* NaN or Inf */
        mantissa = (mantissa ? (sign = 0, 0x7fffff) : 0);
        exponent = 0xff;
    } else if (!exponent) {  /* Denorm or Zero */
        if (mantissa) {
            unsigned int msb;
            exponent = 0x71;
            do {
                msb = (mantissa & 0x400000);
                mantissa <<= 1;  /* normalize */
                --exponent;
            } while (!msb);
            mantissa &= 0x7fffff;  /* 1.mantissa is implicit */
        }
    } else {
        exponent += 0x70;
    }
    int temp = ((sign << 31) | (exponent << 23) | mantissa);

    return *((float*)((void*)&temp));
}

标签:lsb,exponent,单精度,mantissa,浮点数,unsigned,C++,sign,ret
From: https://www.cnblogs.com/PeterZ1997/p/18418877

相关文章

  • C++14的一些新特性
    记录一些C++14的一些特性: 函数返回值类型推导:C++14对函数返回类型推导规则做了优化:#include<iostream>usingnamespacestd;autofunc(inti){returni;}intmain(){cout<<func(4)<<endl;return0;}返回值类型推导也可以用在模板中:#include......
  • Rust中的&运算符取一个变量的地址与C/C++中意义相同么?如果不同又有什么区别呢?
    Rust中的&运算符与C/C++中的&运算符有相似之处,但它们的行为和作用有一些关键区别,特别是在所有权、内存安全和编译期检查方面。1.相似之处在Rust和C/C++中,&运算符都用于获取变量的地址,即生成一个指针或引用。它们的作用可以概括为:将一个值的引用或地址作为结果,而不......
  • C++中一般指针,指针数组,数组指针
    凤凰台上凤凰游,凤去台空江自流。吴宫花草埋幽径,晋代衣冠成古丘。三山半落青天外,二水中分白鹭洲。总为浮云能蔽日,长安不见使人愁。                            ——《登金陵凤凰台》【唐】李白 今天是中秋节,小......
  • C++11的一些特性
    记录一下使用过的C++11的一些特性,大致分为三部分:并发相关,智能指针相关,chrono。 并发相关:std::thread相关:#include<iostream>#include<thread>usingnamespacestd;intmain(){autofunc=[](){for(inti=0;i<10;++i){cout<<i<......
  • 3D高斯渲染 (1-3)ros下 接受c++节点发送的位姿,python节点渲染图像返回,同步版本
    基础学习3D高斯渲染(1-2)ros下接受c++节点发送的位姿,python节点渲染图像返回https://www.cnblogs.com/gooutlook/p/18385485ros自定义消息(图像+标志位+位姿)python和c++发布和接受https://www.cnblogs.com/gooutlook/p/18412553 本工程代码为什么要做这个,因为之前的版本......
  • c++ 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)
    给定一组点,将这些点连接起来而不相交例子: 输入:points[]={(0,3),(1,1),(2,2),(4,4),          (0,0),(1,2),(3,1},{3,3}};输出:按以下顺序连接点将    不造成任何交叉    {(0,0),(3,1),(1,1),(2,2),(3,3),......
  • C++信奥老师解一本通题 1164:digit函数
    ​【题目描述】在程序中定义一函数digit(n,k),它能分离出整数n从右边数第k个数字。【输入】正整数n和k。【输出】一个数字。【输入样例】318593【输出样例】8#include<iostream>usingnamespacestd;intdigit(longlongn,intk){ if(k==1) returnn%10......
  • C++信奥老师解一本通题 1369:合并果子(fruit)
    ​【题目描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n−1次合并之后,就只剩下一堆了。多多在合并......
  • C++学习笔记(26)
    七、显示字符串中的字符从界面上输入一个字符串(C风格),把字符串中的每个字符显示出来,如果输入的是"abc",要求:1)正序显示:abc2)逆序显示:cba求字符串的长度可以利用上一题的成果,也可以直接用strlen()函数,关注性能的细节。示例:#include<iostream>usingnamespacestd;//......
  • C++实现的小游戏
    大家好,这几天做项目太忙,时间不够去更新,十分抱歉。今天凌晨花了半个点的时间写了一个小游戏的青春版,给大家分享。游戏名:想玩电脑?先过我这关!首先我先来说明一下游戏的规则:我们用C++写了一个0~100的随机数,用户有五次机会可以猜数字,猜对了就可以玩电脑,猜错了电脑就会关机(当然你要......