Tom*_*y K 10 c floating-point double normalization
我正在尝试将inta 转换为自定义浮点数,其中用户指定为exp和尾数保留的位数,但我不明白转换是如何工作的.我的函数接受一个int值,而int exp表示数字(值*2 ^ exp),即value = 12,exp = 4,返回192.但我不明白我需要做的更改这些过程.我已经看了好几天并玩IEEE转换器网络应用程序,但我只是不明白规范化过程是什么.就像我看到它"移动二进制点并调整指数"但我不知道这意味着什么,有谁可以给我一个例子来解决?我也不明白指数偏差是什么.我唯一的信息是你只是给你的指数添加一个数字,但我不明白为什么.我一直在谷歌搜索一个我能理解的例子,但这对我没有任何意义
eig*_*ris 25
当我们强制其尾数的整数部分精确并允许其分数部分为我们喜欢的任何值时,浮点数被归一化1.
例如,如果我们取数13.25,这是1101.01在二元的,1101将整数部分,01将是小数部分.
我可以表示13.25为1101.01*(2^0),但这不是规范化的,因为整数部分不是1.但是,如果我们将指数增加1,我们可以将尾数移到右边的一位数:
1101.01*(2^0)
= 110.101*(2^1)
= 11.0101*(2^2)
= 1.10101*(2^3)
Run Code Online (Sandbox Code Playgroud)
这种表示1.10101*(2^3)形式是标准化的形式13.25.
也就是说,我们知道标准化的浮点数总是会出现在表格中1.fffffff * (2^exp)
为了效率,我们不打扰1在二进制表示本身中存储整数部分,我们只是假装它在那里.因此,如果我们为尾数提供定制的浮点类型5位,我们就会知道这些位10100 实际上代表了1.10100这些位.
以下是标准23位尾数的示例:

至于指数偏差,让我们来看看标准的32位float格式,它分为3个部分:1个符号位,8个指数位和23个尾数位:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
Run Code Online (Sandbox Code Playgroud)
该指数00000000和11111111具有特殊用途(如代表Inf和NaN),所以用8个指数位,我们可以表示254个不同的指数,说2^1来2^254,例如.但是,如果我们要代表2^-3什么呢?我们如何获得负面指数?
该格式通过自动从指数中减去127来解决此问题.因此:
0000 0001 将会 1 -127 = -126 0010 1101 将会 45 -127 = -820111 1111 将会 127-127 = 01001 0010 将会 136-127 = 9这会改变指数范围2^1 ... 2^254,2^-126 ... 2^+127因此我们可以表示负指数.
汤米——chux 和 eigenchris 以及其他人提供了很好的答案,但如果我正确地看待你的评论,你似乎仍然在为“我将如何获取这些信息然后使用这是在创建自定义浮点表示,其中用户指定指数的位数?” 别难过,你在前十几次穿过它时,它就像泥一样清晰。我想我可以尝试一下清理它。
您熟悉以下 IEEE754-Single-Precision-Floating-Point 表示:
IEEE-754 Single Precision Floating Point Representation of (13.25)
0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
Run Code Online (Sandbox Code Playgroud)
即1-bit sign-bit, 8-bit biased exponent(以 8 位超额 127 表示法),以及其余的23-bit mantissa.
当您允许用户选择指数中的位数时,您将不得不重新编写指数符号以使用新的用户选择限制。
那会改变什么?
它会改变sign-bit处理方式吗?不会。
它会改变mantissa处理方式
吗-不(您仍然会将尾数/有效数转换为“隐藏位”格式)。
所以你唯一需要关注的是exponent handling。
你会如何处理这个问题?回想一下,当前的 8 位指数采用所谓的超额 127 表示法(其中 127 表示7允许在当前8-bit限制内包含和表达任何偏差的位的最大值。如果您的用户选择 6 位作为指数大小,那又怎样呢?您将必须提供一个类似的方法来确保您有一个固定的数字来表示您的新超额-##符号,该符号将在用户限制内工作。
取6-bit用户限制,然后可以尝试选择无偏指数值31(可以在 中表示的最大值5-bits)。对此,您可以应用相同的逻辑(以上面的 13.25 为例)。数字的二进制表示是1101.01将小数3 positions to the left移到1.10101哪个位置,从而得到 的指数偏差3。
在您的6-bit exponent情况下,您将添加3 + 31以获得您excess-31 notation的指数:100010,然后将尾数置于“隐藏位”格式(即1从1.10101导致您的新自定义汤米精度表示中删除前导:
IEEE-754 Tommy Precision Floating Point Representation of (13.25)
0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
Run Code Online (Sandbox Code Playgroud)
与1-bit sign-bit, 6-bit biased exponent(以 6 位超额 31 表示法),其余的25-bit mantissa.
相同的规则适用于反转过程以从上述符号中恢复浮点数。(只是使用31而不是127支持指数的偏差)
希望这在某种程度上有所帮助。如果您真的要允许用户选择的指数大小,我看不到您可以做的其他事情。请记住,IEEE-754 标准不是凭空猜测的,并且在得出 1-8-23 符号-指数-尾数布局时需要进行大量合理的推理和权衡。但是,我认为您的练习在要求您牢牢理解标准方面做得很好。
现在完全丢失并且在此讨论中未解决的是这会对可以在此表示的数字范围产生什么影响Custom Precision Floating Point Representation。我没有看过它,但主要的限制似乎是可以表示的减少MAX/MIN。
“标准化过程”将输入转换为选择范围。
binary32期望有效数(不是尾数)在范围内,1.0 <= s < 2.0除非数字具有最小指数。
示例:
value = 12, exp = 4与
value = 12/(2*2*2), exp = 4 + 3
value = 1.5, exp = 7
由于有效数总是有一个前导数字1(除非该数字具有最小指数),因此无需存储它。并且不是将指数存储为7,而是向其添加 127 的偏差。
值 = 1.5 十进制 --> 1.1000...000 二进制 --> 0.1000...000 存储二进制(总共 23 位)
exp = 7 --> 偏差 exp 7 + 127 --> 134 十进制 --> 10000110 二进制
存储的二进制模式是“符号”、“隐含前导 1 位的有效数”和“偏差指数”的串联
0 10000110 1000...000 (1 + 8 + 23 = 32 bits)
Run Code Online (Sandbox Code Playgroud)
当偏置指数是0- 最小值时,隐含位是0,因此0.0可以存储很小的数字。
当偏置指数为255- 最大值时,存储的数据不再代表有限数字,而是“无穷大”和“非数字”。
查看引用的链接以获取更多详细信息。
Que*_*232 -1
要标准化尾数,请将小数点放在最左边的非零数字的左侧
例如
以标准化形式表示 10.11 以 2 为底
= 0.1011 基数 2 * 2 的二次方
2 的基数是因为您正在使用二进制数,而 +ve 2 的幂是因为您将小数点向左移动了两次。请记住,尾数仅使用 4 位
所以尾数是 1011
| 归档时间: |
|
| 查看次数: |
26241 次 |
| 最近记录: |