【问题标题】:Stability (Numerical analysis)稳定性(数值分析)
【发布时间】:2012-11-07 19:26:02
【问题描述】:

我试图找到满足以下等式的最大机器数 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, 以便您可以看到发生了什么?
  • 你到底想达到什么目的?也许this question 有帮助...

标签: matlab


【解决方案1】:

答案是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)))

【讨论】:

  • @iz:如果你想用循环来做这个,取2^(-i+floor(log2(a))并增加i直到a+x==a变为真。最有可能的是,迭代将在 i==53 处停止。
  • @iz:或者,从x==a 开始,将a 除以二,直到完成
  • @iz:不客气。如果它解决了您的问题,请考虑接受我的回答。
  • @iz:实际上应该以2^(floor(log2(a)) 开头,而不是a。然后你会得到同样的结果。 eps(a) 返回 2 的幂,如果 a 不是 2 的幂,则会得到稍微不同的结果。
  • @iz: floor 向下舍入。 log2 取以 2 为底的对数。因此,2^floor(log2(a)) 是小于 a 的 2 的最大幂。
【解决方案2】:

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

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

听起来您正在尝试查找 matlab 数据类型的分辨率。看到这个:http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html

【讨论】:

    【解决方案3】:

    正确答案是,由 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
    

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2019-11-05
      • 2011-10-14
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2011-11-26
      相关资源
      最近更新 更多