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 + Awhenが 0 に等しい唯一の条件です。Xデフォルトでは、matlab のデータ型はdoubles64 ビットです。

matlab が代わりに 8 ビット整数を使用していたとしましょう。A = X + A方程式を満たす唯一の方法Xは、 のバイナリ表現を持つことです[0 0 0 0 0 0 0 0]。したがって、整数から小数点が切り捨てられるため、1 から 0 までの任意の数値が機能します。したがって、整数を使用していた場合、 の値を の間の任意A = A + Xの値に設定すると、true に解決されます。ただし、この値は意味がありません。なぜなら、X はこの値ではなく、 の値を取るからです。X[0,1)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 に答える