我有以下载体
vec = [ 255 0 255 0 255 0 255 0 255 0 255 0 255 0 255 0]
vec 1x16 double
并使用以下命令
polyval(vec', 256);
我得到了
ans = 3.3896e+038
但是当我试图取回原始载体时
vec2 = decimal2base(ans, 256)
我得到了
vec2 = 255 0 255 0 255 1 0 0 0 0 0 0 0 0 0 0
这显然不是我的原始载体。
如果再次在此向量中运行polyval
polyval(vec2', 256);
我得到了
ans=
3.3896e+038
我不完全确定我犯了什么样的错误,因为我知道我的转换功能还可以,所以它必须是一个数字精确的东西。
答案 0 :(得分:4)
3.3896e+038
高于double
可以表示的最大整数而不会丢失准确性。
最大数量是2 ^ 53或
>> flintmax('double')
ans =
9.0072e+15
所以你正在失去准确性,你无法逆转计算。
仅使用uint64
值进行计算:
>> pows = uint64(fliplr(0:numel(vec)-1));
>> sum(uint64(vec).*(uint64(256).^pows),'native')
ans =
18446744073709551615
那是1.84e + 19。只是 little 与你使用双打时的不同。但是等等......那个号码looks familiar:
>> intmax('uint64')
ans =
18446744073709551615
所以,你也超出了无符号的64位整数:
>> uint64(256).^pows
ans =
Columns 1 through 5
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615
Columns 6 through 10
18446744073709551615 18446744073709551615 18446744073709551615 72057594037927936 281474976710656
Columns 11 through 15
1099511627776 4294967296 16777216 65536 256
Column 16
当你达到255 ^ 8左右时,你正在通过intmax('uint64')
并且你无法管理这么大的数字,至少不能使用MATLAB的内置数据类型
答案 1 :(得分:0)
看看是否会返回' 1':
polyval(vec(6:end),256)==polyval(vec2(6:end),256);
如果是这样,那么它只是' 255 + 1'对于那个特殊的' vec'。