在 Matlab 中对浮点数进行位修改

Posted

技术标签:

【中文标题】在 Matlab 中对浮点数进行位修改【英文标题】:Performing Bit modification on Floating point numbers in Matlab 【发布时间】:2011-07-11 20:40:40 【问题描述】:

我在 Matlab 中使用非负矩阵分解将矩阵分解为两个因子。使用它,我从 A 中得到两个双精度浮点矩阵,B 和 C。

样本结果是

B(1,1) = 0.118
C(1,1) = 112.035

我现在正在尝试修改这些值中的特定位,但是在任一值上使用 bitset 函数都会出错,因为 bitset 需要无符号整数。

我也尝试过使用 dec2bin 函数,我认为它会将小数转换为二进制,但它为 B(1,1) 返回“0”。

有谁知道在不丢失精度的情况下在位级别处理浮点数的任何方法?

【问题讨论】:

纯粹出于好奇,你为什么要这样做? 它是一个使用 NNMF 来增加安全性的隐写术项目。这是一个大学项目,但我真的很难使用 Matlab 【参考方案1】:

您应该查看typecastbitset 函数。 (分别为文档here 和here)。这可以让你做类似的事情

xb = typecast( 1.0, 'uint64' );
xb = bitset( xb, 10, 1 );
typecast( xb, 'double' );

【讨论】:

这种方法可以将双精度转换为值 bitset 可以使用,但是当我将其转换回来而不是得到 0.118 时,我得到 1.000 你试过“bitset(typecast(B(1,1), 'uint64'),...)”吗?此外,“十六进制格式”以十六进制显示基础数据值...【参考方案2】:

num2hex 和 hex2num 函数是你的朋友。 (虽然不一定是很好的朋友;十六进制字符串并不是处理二进制浮点数的最佳想象形式。您可以将它们拆分为 8 个 nybble 块并将每个块转换为整数。)

来自 MATLAB 文档:

num2hex([1 0 0.1 -pi Inf NaN])

返回

ans =

3ff0000000000000
0000000000000000
3fb999999999999a
c00921fb54442d18
7ff0000000000000
fff8000000000000

num2hex(single([1 0 0.1 -pi Inf NaN]))

返回

ans =

3f800000
00000000
3dcccccd
c0490fdb
7f800000
ffc00000

【讨论】:

typecast 优于 num2hex。 (不确定何时引入) 噢,我不知道类型转换。我完全同意:比 num2hex 和 hex2num 更好。谢谢。

以上是关于在 Matlab 中对浮点数进行位修改的主要内容,如果未能解决你的问题,请参考以下文章

基数排序浮点数

对浮点数进行位移

C语言中如何对浮点数进行四舍五入?

C中的printf如何对浮点数进行舍入?

C语言编写函数,对浮点数保留两位小数,对第三位四舍五入。程序如下 #include<stdio.h

MATLAB里将十进制负小数转换成十六进制数