Matlab 稳定性(数值分析)

Matlab 稳定性(数值分析),matlab,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 任何帮助

我试图找到满足以下等式的最大机器数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

任何帮助都将不胜感激。

您的小算法肯定是不正确的。A=X+A的唯一条件是X等于0。默认情况下,matlab数据类型为双精度64位

让我们假设matlab使用的是8位整数。满足方程A=X+A的唯一方法是X具有[0 0 0]的二进制表示形式。因此,任何介于1和0之间的数字都可以工作,因为小数点是从整数截断的。同样,如果你使用整数A=A+X,如果你将X的值设置为[0,1]之间的任何值,那么它将解析为true。但是这个值是没有意义的,因为X不会取这个值,而是取0的值


听起来好像你在试图找到matlab数据类型的分辨率。请参见:

你是个小算法肯定是不正确的。A=X+A的唯一条件是X等于0。默认情况下,matlab数据类型是64位的双精度数

让我们假设matlab使用的是8位整数。满足方程式A=X+A的唯一方法是使X具有[0 0 0 0]的二进制表示形式。因此,任何介于1和0之间的数字都将起作用,因为小数点是从整数截断的。因此,如果使用整数A=A+X,则如果将X的值设置为[0,1]之间的任何值,则将解析为true。但是,此值没有意义,因为X不会接受此值,而是接受0的值

听起来你在试图找到matlab数据类型的分辨率。请看:

答案是epsa/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
如果你不想依赖每股收益,你可以计算出如下数字

2^(-53+floor(log2(a)))
答案是epsa/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
如果你不想依赖每股收益,你可以计算出如下数字

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

正确答案是,由Jonas提供:0.5*epsa

以下是经验和近似解的备选方案:

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

idx =

    59

>> e(idx)

ans =

  2.2737e-013

正确答案是,由Jonas提供:0.5*epsa

以下是经验和近似解的备选方案:

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

idx =

    59

>> e(idx)

ans =

  2.2737e-013

为什么不为每个循环迭代打印x,x+a,这样你就可以看到发生了什么?你到底想实现什么?也许会有帮助…为什么不为每个循环迭代打印x,x+a,这样你就可以看到发生了什么?你到底想实现什么?也许会有帮助…@iz:如果你想对循环执行此操作,请使用2^-i+floorlog2a和增量直到a+x==a变为真。最有可能的是,迭代将在i==53处停止。@iz:或者,从x==a开始,将a除以2,直到done@iz不客气。如果它解决了你的问题,请考虑接受我的回答。@ i:而不是从A开始,你应该先从2 ^ SooLogLog2a开始。然后你会得到同样的结果。t、 epsa返回2的幂,如果a不是2的幂,则得到的结果会略有不同。@iz:floor向下舍入。log2将对数取为基数2。因此,2^floorlog2a是2的最大幂,它小于a。@iz:如果要对循环执行此操作,则取2^-i+floorlog2a并递增i,直到a+x==a变为真。最像y、 迭代将在i==53处停止。@iz:或者,从x==a开始,将a除以2,直到done@iz不客气。如果它解决了你的问题,请考虑接受我的回答。@ i:而不是从A开始,你应该先从2 ^ FooLogLog2a开始。然后你会得到同样的结果。EPSA返回两个幂,如果A。不是2的幂,您将得到一个稍有不同的结果。@iz:floor向下舍入。log2将对数以2为底。因此,2^floorlog2a是小于a的2的最大幂。