Float32转Float16

C++ 内置数据类型

C#内置数据类型

但是float是32位,很多情况下在精度不需要极其精确的情况下使用16位是完全足够的,因为half的数据类型应运而生:

半精度浮点数Half

精度比较:

16位Float精度:

数值计算公式为:(-1)^signbit * 2^(e) * (1+significantbits)

最大值为:0 11110 1111111111=(-1)^0 * 2^15 * (1+1-2^-10)=65504

最小值为:0 00001 0000000000=2^-14=6.10 * 10^-5

//转载:
 static byte[] FloatToHalf(float f)
        {          
            Byte[] bytes = BitConverter.GetBytes(f);
            Byte sign = 0x80;
            SByte exp;
            byte[] myByte = new byte[2];//返回的数组
            ushort result;

            ushort m;
            sign = (Byte)(bytes[3] & sign);//求符号位
            //求指数位
            exp = (SByte)(bytes[3] << 1);
            exp += (SByte)(bytes[2] >> 7);
            exp -= 127;
            exp += (SByte)((1<<(expSize -1)) -1);
            if (exp < 0)//下溢出
                exp = 0;
            //求尾数
            m = (ushort)(bytes[2] & 0x7f);
            m = (ushort)(m << (mSize - 7));
            m += (ushort)(bytes[1] >> (15-mSize));
            if (((bytes[1] >> (15 - mSize - 1)) & 1) == 1)//若被移除的最高位是1,则产生进位。
                m += 1;
            if (m >= (ushort)Math.Pow(2, mSize))//若进位后发生尾数溢出,则取消进位
                m -= 1;

            result = sign;
            result = (ushort)(result << 8);//把符号位移动到最高位上
            //装载指数位
            short temp1 = exp;
            temp1 = (short)(temp1 << (15-expSize));
            result += (ushort)temp1;
            result += m;//装载尾数
            myByte[0] = (byte)result;
            myByte[1] = (byte)(result >> 8);
            return myByte;
        }
    /**
     * <code>HalfFloatUtils</code> 类用于创建HalfFloat工具。
     */
    class HalfFloatUtils {

        /**
         * round a number to a half float number bits.
         * @param num 
         */
        static roundToFloat16Bits(num: number): number;

        /**
         * convert a half float number bits to a number.
         * @param float16bits - half float number bits
         */
        static convertToNumber(float16bits: number): number;
    }

参考:

Half-precision floating-point format - Wikipedia

浮点数值类型 - C# 引用 | Microsoft Docs

Uint16Array - JavaScript | MDN (mozilla.org)

Float16和Float32的互相转换 - BlueBerry006 - 博客园 (cnblogs.com)

(61条消息) 半精度浮点数(fp16,Half-precision floating-point)_mc18740458059的博客-CSDN博客_float16范围

浮点数的一般表示 - 简书 (jianshu.com)

(61条消息) 浮点数的表示 —— 基本格式、规格化、表示范围_starter_____的博客-CSDN博客_浮点数规格化规则

(61条消息) C#半精度浮点数的实现_学习记录-CSDN博客_c# 半精度浮点

(61条消息) 浮点数双精度,单精度以及半精度知识总结_学之知之的博客-CSDN博客_c# 半精度浮点

浮点数-Float-Double转二进制 - ToolTT在线工具箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值