gpt4 book ai didi

matlab - 使用 uint64 将 64 位数字从二进制转换为十进制

转载 作者:行者123 更新时间:2023-12-02 02:00:10 28 4
gpt4 key购买 nike

我想将 64 位数字从二进制转换为十进制。由于 dec2bin 最多仅支持 52 位,我想我可以推出自己的函数并使用 uint64 来超越此限制:

function [dec] = my_bin2dec(bin)
v = uint64(length(bin)-1:-1:0);
base = uint64(2).^v;
dec = uint64(sum(uint64(base.*(uint64(bin-'0')))));
end

但是,它没有按预期工作:

my_bin2dec('111000000000000000000000000000000000001010110101011101000001110')

ans =

8070450532270651392

my_bin2dec('111000000000000000000000000000000000001010110101011101000001111')

ans =

8070450532270651392

这是正确的结果:

(111000000000000000000000000000000000001010110101011101000001110)bin 
= (8070450532270651918)dec

(111000000000000000000000000000000000001010110101011101000001111)bin
= (8070450532270651919)dec

我错过了什么?似乎仍然有一些操作是使用 52 位 double 运算执行的,但我不知道是哪一个。

我检查了这些操作是否适用于uint64,看来我使用的操作(powertimessum )有:

>> methods uint64

Methods for class uint64:

abs bitxor diff isinf mod plus sum
accumarray bsxfun display isnan mpower power times
all ceil eq issorted mrdivide prod transpose
and colon find ldivide mtimes rdivide tril
any conj fix le ne real triu
bitand ctranspose floor linsolve nnz rem uminus
bitcmp cummax full lt nonzeros reshape uplus
bitget cummin ge max not round xor
bitor cumprod gt min nzmax sign
bitset cumsum imag minus or sort
bitshift diag isfinite mldivide permute sortrowsc

最佳答案

你说得对

It seems like there is some operation still performed using 52bit double arithmetic.

问题在一线

dec = uint64(sum(uint64(base.*(uint64(bin-'0')))));

运算 sum(uint64(base.*(uint64(bin-'0')))) 给出一个 double 结果,该结果只有大约 15 位有效数字。这就是为什么你的最低数字是错误的。随后转换为 uint64 没有帮助,因为精度已经丢失。

解决方案是在 uint64本地求和。这给出了具有完整精度的 uint64 结果:

dec = sum(uint64(base.*(uint64(bin-'0'))), 'native');

关于matlab - 使用 uint64 将 64 位数字从二进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com