【CO101】计算机组成原理笔记1 —— 定点数转单精度浮点数(SEM)

笔者:YY同学

生命不息,代码不止。好玩的项目尽在GitHub



定点与浮点

  • 定点(Fixed Point)
    所谓定点就是一个固定小数点位置的表达形式,比如 3.140.618。用这种方法表示的 小数(fractional) 比较直观易懂,但是不利于表示非常大或者非常小的小数。

  • 浮点(Floating Point)
    然而在计算机中,我们表示的小数的范围需要具有一定的灵活性,因此我们采用了科学计数法(SEM,一般是二进制),将小数分成三块分别进行存储。


    在这里插入图片描述


单精度浮点数组成

在这里插入图片描述

单精度一般是 32bits,其中第1位表示 符号(sign), 中间8位表示 指数大小(exponent),最后23位则表示 正规化之后的小数尾数(Mantissa)


转化步骤

在这里插入图片描述

  1. 正规化(Normalize)

先将整数和小数部分分别转化为二进制,整数部分除二取余从右往左排,小数部分乘二取整从左往右排,然后写在一起。

在这里插入图片描述

  1. 移位

将小数点左移至第一位后面,然后乘2的移位次方。
− 1011. 1 2 = − 1.0111 ∗ 2 3 -1011.1_2 = -1.0111 * 2^3 1011.12=1.011123

  1. 分别计算SEM(记得都转成二进制)

S 代表符号,负数为1,正数为0。例子中为负数因此 S = 1
E 代表指数大小 + 偏移量(bias),单精度下 bias = 127。因此 E = 3 + 127 = 130 = 10000010
M 仅代表小数尾数,M = 01110000000000000000000


因此最后的计算结果为SEM的组合:
− 11. 5 10 = 1100000100111000000000000000000 0 2 = 0 x C 1380000 -11.5_{10} = 11000001001110000000000000000000_2 = 0xC1380000 11.510=110000010011100000000000000000002=0xC1380000


表示范围

S 的值仅为 0 或 1
E 最小为 00000001 = 1,最大为 11111110 = 254
M 最小为 00000000000000000000000,最大为 11111111111111111111
量级(Magnitude)范围 1.8 ∗ 1 0 − 38 1.8*10^{-38} 1.81038 ~ 3.4 ∗ 1 0 38 3.4*10^{38} 3.41038
整体范围 − 3.4 ∗ 1 0 38 -3.4*10^{38} 3.41038 ~ − 1.8 ∗ 1 0 − 38 -1.8*10^{-38} 1.81038 1.8 ∗ 1 0 − 38 1.8*10^{-38} 1.81038 ~ 3.4 ∗ 1 0 38 3.4*10^{38} 3.41038

在这里插入图片描述


特殊表示

在这里插入图片描述

  • 全0:0
  • E全为1,M全为0:+∞ / -∞
  • E全为1,M为非0:不是一个数字(NaN)
  • E全为0,M为非0:未被正规化的数字
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在WinForm应用程序中,将十六进制换为单精度浮点数需要一些数学运算和代码实现。这里提供一种简单的实现方法。 首先,将十六进制字符串换为整数。可以使用int.Parse或Convert.ToInt32方法,或者使用自定义的十六进制换方法。 然后,将整数换为单精度浮点数单精度浮点数的32位二进制表示分为三个部分:符号位、指数位、尾数位。其中,符号位为1位、指数位为8位、尾数位为23位。 根据IEEE 754标准,单精度浮点数的表示方法为:(-1)^s x (1+f) x 2^(e-127),其中s为符号位、f为尾数位换的十进制数、e为指数位换的十进制数。 具体实现过程如下: 1. 将十六进制字符串换为整数。 string hexString = "42f6e980"; //示例十六进制字符串 int intValue = Convert.ToInt32(hexString, 16); 2. 将整数换为单精度浮点数。 int signBit = intValue >> 31; //取符号位 int exp = (intValue >> 23) & 0xff; //取指数位 int frac = intValue & 0x7fffff; //取尾数位 float result = Mathf.Pow(-1, signBit) * (1 + frac / Mathf.Pow(2, 23)) * Mathf.Pow(2, exp - 127); 需要注意的是,在Unity中使用C#编程时,需要使用Mathf.Pow函数代替Math.Pow函数进行浮点数幂运算。 以上就是将十六进制换为单精度浮点数的简单实现方法。如果需要更详细或更高效的实现,可以参考IEEE 754标准及其他代码实现方法。 ### 回答2: Winform 十六进制单精度浮点数的实现方法如下: 首先我们需要了解单精度浮点数的二进制表示方法。单精度浮点数共32位,符号位占1位,指数位占8位,尾数位占23位,其中指数位用偏移值表示,即实际指数值等于指数位的二进制值减去127。 而十六进制数可以直接换为二进制数,每个十六进制位对应4个二进制位。因此,我们可以将十六进制数换为32位的二进制数后,分别取符号位、指数位和尾数位,按照上述方法换为单精度浮点数的十进制表示。 下面是代码实现: ``` private float HexToFloat(string hex) { int raw = Convert.ToInt32(hex, 16); byte[] floatVals = BitConverter.GetBytes(raw); float result = BitConverter.ToSingle(floatVals, 0); return result; } ``` 首先将十六进制字符串换为整型值 `raw`,然后使用 `BitConverter` 类的 `GetBytes()` 方法将 `raw` 换为字节数组 `floatVals`,最后使用 `BitConverter` 类的 `ToSingle()` 方法将 `floatVals` 换为单精度浮点数的十进制表示值 `result`。 使用该方法,我们可以将任意十六进制数换为单精度浮点数。例如,将十六进制数 `3f800000` 换为单精度浮点数的十进制表示值为 1.0。 ### 回答3: WinForm 是 Microsoft 提供的一种图形用户界面开发框架,可用于开发 Windows 应用程序。而十六进制单精度浮点数,则是一种数字处理方法,将十六进制数换为单精度浮点数。 在 WinForm 中,我们可以使用 C# 语言编写程序实现这种换。首先,我们需要定义一个文本框来输入十六进制数,一个按钮来触发换,另外还需要一个文本框来显示结果。 当用户点击换按钮时,程序会首先读取用户在输入框中输入的十六进制数,然后将其换为十进制数。接着,我们需要将这个十进制数换为单精度浮点数,这可以使用 BitConverter 类的 ToSingle 函数来实现。最后,我们将换后的单精度浮点数显示在输出文本框中,即完成了十六进制单精度浮点数的过程。 下面是一个简单的示例代码: ``` private void btnConvert_Click(object sender, EventArgs e) { string hex = txtHex.Text; int dec = Convert.ToInt32(hex, 16); float f = BitConverter.ToSingle(BitConverter.GetBytes(dec), 0); txtFloat.Text = f.ToString(); } ``` 需要注意的是,在换十六进制数为十进制数时,我们使用了 Convert.ToInt32 函数。这个函数会将输入的字符串换为 32 位有符号整数,而单精度浮点数也是 32 位的,因此可以使用 BitConverter.ToSingle 函数将整数换为浮点数。 以上就是使用 WinForm 实现十六进制单精度浮点数的一个简单方法。当然,实际应用中还需要考虑错误处理、界面设计等多种因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值