稳定性(数值分析)

时间:2012-11-07 19:26:03

标签: matlab

我正在尝试找到满足以下等式的最大机器数x:x + a = a,其中a是给定的整数。 (我不允许使用eps。)

这是我的代码(实际上没有用):

function [] = Largest_x()

a=2184;
x=0.0000000001
while (x+a)~=a
    x=2*x;
end
fprintf('The biggest value of x in order that x+a=a \n (where a is equal to %g) is : %g \n',a,x);
end

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

答案是eps(a)/2

eps是下一个浮点数的差异,所以如果你向浮点数加一半或更少,它就不会改变。例如:

100+eps(100)/2==100
ans =
     1

%# divide by less than two
100+eps(100)/1.9==100
ans =
     0

%# what is that number x?
eps(100)/2
ans =
   7.1054e-15

如果您不想依赖eps,可以将数字计算为

2^(-53+floor(log2(a)))

答案 1 :(得分:1)

你是小算法当然不正确。当A = X + A等于0时X的唯一条件。默认情况下,matlab数据类型为doubles,为64位。

让我们假装matlab改为使用8位整数。满足等式A = X + A的唯一方法是X具有[0 0 0 0 0 0 0 0]的二进制表示。因此,1到0之间的任何数字都可以起作用,因为小数点会从整数中截断。因此,如果您使用整数A = A + X,如果要将X的值设置为[0,1)之间的任何值,则会再次解析为true。但是这个值没有意义,因为X不会接受这个值,而是取值0

听起来你正试图找到matlab数据类型的分辨率。请参阅:http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html

答案 2 :(得分:0)

正确答案是Jonas提供的:0.5 * eps(a)

以下是经验和近似解决方案的替代方案:

>> a = 2184;
>> e = 2 .^ (-100 : 100); % logarithmic scale
>> idx = find(a + e == a, 1, 'last')

idx =

    59

>> e(idx)

ans =

  2.2737e-013