pla*_*ido 3 c matlab bit-manipulation
我想实现从整数到浮点数的映射,但是我的底层知识有点生疏。该映射在本文中进行了描述:
\n\n\n3.2 映射到整数
\n我们可以通过浮点减法来计算预测残差,但这可能会导致下溢,从而导致不可逆的信息丢失,从而无法重建实际值。相反,如[7, 22]中所示,我们将预测的和实际的浮点数 p 和 f 映射到它们的符号-数值二进制\整数表示。在实现signmagnitude\n整数算术的平台上,我们现在可以通过减法简单地计算\n整数残差,但是大多数当前平台\n实现两个\xe2\x80\x99s补码算术。为了解决这个问题,我们通过翻转最高有效位(对于正浮点数)或所有位(对于负浮点数)将符号量表示映射到无符号整数。结果是浮点数到无符号整数的单调映射,该映射保留了具有相同符号和指数的浮点数的差异的排序甚至线性。这种方法也\n类似于[16],但是,如果 p 和 f\n 很接近,但被指数边界分开,那么我们可以通过允许进位从尾数传播到指数而受益,这将被表示为较大的错误预测[16]。
\n
还有一些 C 示例代码,但我不太确定我是否复制了正确的部分:
\ntypedef float F32;\ntypedef int I32;\ntypedef unsigned int U32;\n\nI32 exponentPred = (((U32&)floatnum) & 0x7F800000) >> 23;\nI32 signPred = (((U32&)floatnum) & 0x80000000) == 0x80000000;\nI32 mantissaPred = (((U32&)floatnum) & 0x007FFFFF);\nRun Code Online (Sandbox Code Playgroud)\n所以我的问题是:
\n谢谢,\n Plasido
\n0x80000000是1000000 00000000 00000000 00000000
0x7F800000是0111111 10000000 00000000 00000000
0x007FFFFF是0000000 01111111 11111111 11111111
现在假设您有一个包含这些数字的浮点变量,每个字符代表一个二进制数字:
浮点数 =SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
((U32&)floatnum) & 0x7F800000是0EEEEEEE E0000000 0000000 00000000
最后做右移>>23得到
0000000 0000000 0000000 EEEEEEEE
((U32&)floatnum) & 0x80000000是S0000000 00000000 0000000 00000000
从而选择标志。
最后,最后一行选择尾数:
((U32&)floatnum) & 0x007FFFFF是00000000 0MMMMMMM MMMMMMMM MMMMMMMM
基本上,代码使用位掩码将浮点分成三个部分。
//编辑丑陋的解决方案删除,在matlab中找到了更好的解决方案:
raw = typecast( single(floatNum), 'uint32' )
exponentPred=bitget(raw,[31:-1:22])
signPred=bitget(raw,[32])]
mantissaPred=bitget(raw,[23:-1:1])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2292 次 |
| 最近记录: |