1

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

任何帮助将非常感激。

4

3 回答 3

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)))
于 2012-11-07T19:41:39.483 回答
1

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

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

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

于 2012-11-07T19:37:55.007 回答
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
于 2012-11-08T17:14:31.643 回答