首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稳定性(数值分析)

稳定性(数值分析)
EN

Stack Overflow用户
提问于 2012-11-08 03:26:03
回答 3查看 520关注 0票数 1

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

下面是我的代码(这不是真正有效的代码):

代码语言:javascript
复制
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

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-08 03:41:39

答案是eps(a)/2

eps是下一个浮点数的差值,因此如果您将一半或更小的值添加到浮点数中,它将不会改变。例如:

代码语言:javascript
复制
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,则可以将该数字计算为

代码语言:javascript
复制
2^(-53+floor(log2(a)))
票数 9
EN

Stack Overflow用户

发布于 2012-11-08 03:37:55

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-11-09 01:14:32

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

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

代码语言:javascript
复制
>> a = 2184;
>> e = 2 .^ (-100 : 100); % logarithmic scale
>> idx = find(a + e == a, 1, 'last')

idx =

    59

>> e(idx)

ans =

  2.2737e-013
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13276737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档