尝试使用polyval时出错

时间:2014-04-24 17:41:17

标签: matlab math precision floating-point-precision largenumber

我有以下载体

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

我不完全确定我犯了什么样的错误,因为我知道我的转换功能还可以,所以它必须是一个数字精确的东西。

2 个答案:

答案 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'。