dec2bin

조회 수: 21(최근 30일)
Talaria 2011년 8월 5일
how do i overcome the limitation of dec2bin of 2^52??
saying i would need to convert numbers greater than 2^52. or is there another possible way to generate all possible binary values of one length. for example: length =3 000, 001, 010, 011, 100, 101, 110, 111.

댓글을 달려면 로그인하십시오.

답변(4개)

Arnaud Miege 2011년 8월 5일
It seems to work for me:
>> dec2bin(2^52)
ans =
10000000000000000000000000000000000000000000000000000
>> dec2bin(2^52+1)
ans =
10000000000000000000000000000000000000000000000000001
Arnaud
댓글 수: 4표시숨기기 이전 댓글 수: 3
Jan 2011년 8월 5일
@Talaria: Which problem do you want to solve exactly? The limitation of DOUBLEs to 53 bit precision can be solved by using UINT64 variables, which allows numbers until 2^64-1. But there will still be the problem, that the number of permutations exceeds the power of current computers dramatically. In other words: There is no way to solve your problem by brute force. To suggest a smarter solution, it is necessary, that you explain the actual problem with any details at first.

댓글을 달려면 로그인하십시오.

Jan 2011년 8월 5일
A fast method to create permutations with order and repetition is FEX: VChooseKRO-mex:
M = VChooseKRO(uint8([0, 1]), 3)
The UINT8 values need 1/8 of the memory occupied by DOUBLEs.
But if you need all permutations with 52 elements, you need some free RAM: 2^52*52 Bytes = 2.34 TB...
댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Walter Roberson 2011년 8월 5일
With regards to a list of all possible binary values of a given length:
If the length desired is N, there are 2^N such values. You want the dec2bin representation of each, which requires one char per original bit. In MATLAB each char requires 2 bytes, so the required storage would be 2^N * 2 = 2^(N+1) bytes.
According to Wikipedia, the current x86_64 architectures implement only 48 bits of addressing space. If you could find a system that implemented and populated all 48 bits of memory, and there was no overhead associated with the storage of the values, then your limit would be N+1 = 48, which would be N=47 -- the best you could hope to do would be to dec2bin() all of the 47 bit numbers, and that would take you 2^48 bytes which would be 256 TB.
댓글 수: 1표시숨기기 없음
Jan 2011년 8월 5일
@Talaria: In addition the calculations will need some years.

댓글을 달려면 로그인하십시오.

Fangjun Jiang 2011년 8월 5일
I'd like to put the question this way. See the example first.
>> dec2bin(2^55+[0 1 2 3 4 5 6 7 8 9 10 100 1000])
ans =
10000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000000001000
10000000000000000000000000000000000000000000000001100000
10000000000000000000000000000000000000000000001111101000
From the help of uint64:
The values of a UINT64 range from 0 to 18,446,744,073,709,551,615,
(that is, from INTMIN('uint64') to INTMAX('uint64')). Values outside
this range are mapped to INTMIN('uint64') or INTMAX('uint64').
NOTE: The range of values that can be passed to UINT64 from the command
prompt or from an M-file function without loss of precision is 0 to
2^53, inclusive. When reading values from a MAT-file, UINT64 correctly
represents the full range 0 to (2^64)-1.
So, not to ask to generate all the possible binary values of a 55-bits binary number, but, is there a way in MATLAB to generate the binary string of two numbers, say (123+2^55) and (456+2^55) and see the exact difference?
The values are still within 2^64-1 so it should be possible. But how to do it? It sounds like need to write the binary number to a .mat file and then load it back?
댓글 수: 1표시숨기기 없음
Walter Roberson 2011년 8월 5일
You need R2011a or later in order to do arithmetic on 64 bit numbers. R2010b extends uint64() to be able to handle hard-coded constants of more than 53 bits, but R2010b does not handle arithmetic on these numbers.
There are ways to handle the computation as uint32 values, but that's usually a nuisance to code directly.
If John d'Errico's "vpi" is still in the file exchange, that could be used.

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!