处理整数系列时的数值错误源

计算科学 matlab 数字 误差估计
2021-12-22 09:47:01

我目前正在尝试递归计算第一个斐波那契数的值。思路如下:

  • 计算fnfn1为了n=2,...,100,
  • 计算fk为了k=n2,n3,,0,
  • 称呼f^0(n)的价值f0计算为n.

这是Matlab我使用的代码:

N = 101;
n = linspace(0, 100, N);

% Fbonacci sequence generation
fn = fibonacci(n+1);

f0 = zeros(1, 99);

% backward computation of \hat{f_0} computation
for i = 2:100
    fi = fn(i+1);
    fi_1 = fn(i);
    fk = cat(2, zeros(1, i - 1), [fi_1, fi]);
    
    for k = i-2:-1:0
        a = fk(k + 3);
        b = fk(k + 2);
        fk(k+1) = a - b;
    end
    f0(i-1) = fk(1);
end

figure(2)
f1 = semilogy(linspace(2, 100, 99), abs(f0));
hold on
f2 = semilogy([0, 100], [1, 1]);
hold on
f3 = semilogy([0, 100], [2/eps, 2/eps]);
grid on

xlabel('$n$', 'Interpreter','latex')
legend([f1, f2, f3], {'$\hat{f}_0$', '$1$: analytical value', '$2/eps$'}, 'Interpreter', 'latex');

我找不到对值的错误的解释f^0在第二个情节。斐波那契数是整数,整数应该在机器中精确表示,还是我错了?因为在这种情况下,当计算f^0递归地,没有舍入或截断。的价值f(100)是 20 阶,距离很远realmax. 我没有看到任何错误来源。

有任何想法吗?

1个回答

整数可以在 Matlab 中“精确”表示,但是很多时候 Matlab 会选择使用浮点双精度,这可能不一定精确地表示所有整数(IIRC精确到大约253)。

实际上,即使您尝试在 matlab 中输入“整数”,它也会告诉您它默认为双精度数:

>> class(1)

ans =

    'double'

您可以尝试通过将其强制转换为固定宽度整数来强制 Matlab 使用整数,例如使用int64(your_value),或符号库宽整数sym(your_value)

当我尝试强制斐波那契函数使用固定宽度整数数学时,它抱怨该函数需要浮点类型或符号。以下是使用各种类型参数调用斐波那契的结果:

>> fibonacci(int64(101))
Error using fibonacci (line 16)
Invalid data type. Argument must be double, single, or sym.

>> fibonacci(101)

ans =

   5.7315e+20

>> fibonacci(sym(101))
 
ans =
 
573147844013817084101

>> fibonacci(101)-fibonacci(sym(101))
 
ans =
 
-14533

Matlab 不能fibonacci(101)用双精度进行精确计算这一事实并不出人意料。答案需要 69 位尾数,而双打只有 53 位尾数。