查看: 5149|回复: 11|关注: 0

[已解决] 如何将超过dec2bin上限的大数值十进制数转换二进制?

[复制链接]

新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
Matlab自带的函数dec2bin能将2^54以内的数转换为二进制,但是超过2^54以上的数怎么办?
用函数dec2bin的简单代码a=2^60-1;
b=dec2bin(a);
得到的结果是b='1000000000……',实际上b='111111111111……'
请问对于这种超过dec2bin函数上限的数怎么转换成二进制

MATLAB 基础讨论
版块优秀回答者

入门

317 麦片

财富积分


50500


13

主题

397

帖子

61

最佳答案
  • 关注者: 3
发表于 2017-12-12 11:45:56 | 显示全部楼层
跟浮点数占用的位数有关, 数越大绝对精度就越低,eps(2^52)=1, 大于2^53的话就分辨不了1这样的数了。
所以就出现了你所说的那种情况。
至于解决办法,可以考虑把原始数据分段(比如分成高字节/低字节)后分别转换,再接起来。

新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-12-12 15:03:28 | 显示全部楼层
lianglinzu 发表于 2017-12-12 11:45
跟浮点数占用的位数有关, 数越大绝对精度就越低,eps(2^52)=1, 大于2^53的话就分辨不了1这样的数了。
所以 ...

分段成高低字节分别转换,再接起来的话,结果不对啊。举个最简单的例子,b=dec2bin(12345678);A=dec2bin(1234);
B=dec2bin(5678);
你运行就发现不对啊

论坛优秀回答者

权威

4166 麦片

财富积分



4

主题

4330

帖子

911

最佳答案
  • 关注者: 205
发表于 2017-12-12 15:26:24 | 显示全部楼层 |此回复为最佳答案
本帖最后由 maple1314168 于 2017-12-14 14:06 编辑
zsz29179 发表于 2017-12-12 15:03
分段成高低字节分别转换,再接起来的话,结果不对啊。举个最简单的例子,b=dec2bin(12345678);A=dec2bin ...

function y = bigdec2bin( x )
e=round(eval(log2(x)));
ind=mod(sym(2)^e,x);
if ind==0
    y=num2str([1,zeros(1,e)]);
else
    y=num2str(double(mod(floor(x*sym(2).^(1-e:0)),2)));
end

自己根据 matlab 的 dec2bin改写的 大数据十进制转换二进制
最大只能达到2^1023(8.9885e+307)  左右。与matlab的realmax(1.7977e+308)接近。

自己可以验证 一下。

bigdec2bin(sym(2)^56-1)

ans =

1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
bigdec2bin(sym('123456789123456789'))

ans =

1  1  0  1  1  0  1  1  0  1  0  0  1  1  0  1  1  0  1  0  0  1  0  1  1  1  0  1  0  1  1  0  0  1  1  0  1  0  0  0  0  0  1  0  1  1  1  1  1  0  0  0  1  0  1  0  1



新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-12-12 16:23:36 | 显示全部楼层
maple1314168 发表于 2017-12-12 15:26
function y = bigdec2bin( x )
e=round(eval(log2(x)));
ind=mod(sym(2)^e,x);

非常感谢!有个小问题请教一下,最后的输出结果里面能把空格去掉吗?

论坛优秀回答者

权威

4166 麦片

财富积分



4

主题

4330

帖子

911

最佳答案
  • 关注者: 205
发表于 2017-12-12 16:30:37 | 显示全部楼层
zsz29179 发表于 2017-12-12 16:23
非常感谢!有个小问题请教一下,最后的输出结果里面能把空格去掉吗?

B=bigdec2bin(sym('123456789123456789'))
B(1:3:end)
ans =110110110100110110100101110101100110100000101111100010101

新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-12-12 16:51:18 | 显示全部楼层
maple1314168 发表于 2017-12-12 16:30
B=bigdec2bin(sym('123456789123456789'))
B(1:3:end)
ans =110110110100110110100101110101100110100000 ...

谢谢大神指导:loveliness:

新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-12-13 10:16:32 | 显示全部楼层
maple1314168 发表于 2017-12-12 16:30
B=bigdec2bin(sym('123456789123456789'))
B(1:3:end)
ans =110110110100110110100101110101100110100000 ...

大神不好意思,还有个问题想请教一下,这个程序能做到固定输出位数吗?比如这种dec2bin(10, 7) ;
ans = 0001010 ;10转2进制是‘1010’,不够7位,然后在前面补零补足七位。

论坛优秀回答者

权威

4166 麦片

财富积分



4

主题

4330

帖子

911

最佳答案
  • 关注者: 205
发表于 2017-12-14 11:35:58 | 显示全部楼层
本帖最后由 maple1314168 于 2017-12-14 15:32 编辑
zsz29179 发表于 2017-12-13 10:16
大神不好意思,还有个问题想请教一下,这个程序能做到固定输出位数吗?比如这种dec2bin(10, 7) ;
ans =  ...

这个不难啊!

function y = bigdec2bin( x ,n)
e=round(eval(log2(x)));
ind=mod(sym(2)^e,x);
if ind==0
    y=num2str([zeros(1,n-e) 1,zeros(1,e)]);
else
    y=num2str([zeros(1,n-e) double(mod(floor(x*sym(2).^(1-e:0)),2))]);
end

                         %n要求大于e,否则,得到原来的位数,需要的话加个if

bigdec2bin(sym(2)^56-1,57)

ans =

0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1

新手

12 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-12-14 14:54:35 | 显示全部楼层
maple1314168 发表于 2017-12-14 11:35
这个不难啊!

function y = bigdec2bin( x ,n)

谢谢大神!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表