我正在尝试寻找满足以下等式的最大机器数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任何帮助都将不胜感激。
发布于 2012-11-08 03:41:39
答案是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-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
发布于 2012-11-09 01:14:32
正确的答案是,由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-013https://stackoverflow.com/questions/13276737
复制相似问题