我正在尝试找到满足以下等式的最大机器数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
非常感谢任何帮助。
答案 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