2

我正在尝试在 MATLAB 中以单精度生成一组均匀分布的浮点值。

我想生成 +/- (2-2^-23)*2^127 范围内的所有数字,它表示基于 IEEE-754 标准的可能 32 位浮点数的范围。问题是只生成了大数量级的数字,我希望也包括小幅度的数字(接近并包括 0)。如果我们取所有生成的数字的绝对值然后找到最小值(我已经复制了代码下面的输出),就会看到这一点。

到目前为止,我在 MATLAB 中有这段代码:

numtogenerate = 20000;

% Preallocate for speed
generatednumber(numtogenerate) = 0;

for i = 1:numtogenerate
   generatednumber(i) =  rand*(2-2^-23)*2^127*2 - 2^127*(2-2^-23); 
end

minimum = min(generatednumber)
smallest = min(abs(generatednumber))
maximum = max(generatednumber)

hist(generatednumber)

这是输出:

minimum =

 -3.4026e+038


smallest =

  8.4046e+033


maximum =

  3.4027e+038
4

1 回答 1

5

(以上帝和小青苹果的名义,你为什么要循环执行此操作?)

我的观点是,使用 MATLAB 的功能来实现。学习使用向量和数组。将操作应用于整个数字数组。这就是像 MATLAB 这样的工具的闪耀之处。在您这样做之前,您还不如使用较低级别的语言,但没有使用该较低级别工具获得的速度优势。

好吧,吐槽一下,那么我们如何解决这个问题呢?

使用三个不同的随机值生成每个数字。

  1. 随机符号
  2. 随机指数
  3. 随机尾数

使用矢量操作完成所有操作。

numtogenerate = 20000;

% the sign
S = (rand(numtogenerate,1) < 0.5)*2 - 1;

% The exponent
E = floor(rand(numtogenerate,1)*256) - 128;

% The mantissa
M = rand(numtogenerate,1)*2 - 2^-23;

% bring it all together
R = S.*M.*2.^E;

它们是否涵盖整个范围?似乎是这样。

min(abs(R))
ans =
      7.44202895026248e-41

max(R)
ans =
      3.17337113940593e+38

min(R)
ans =
      -3.3810631675676e+38

假设我得到了每个部分的正确范围,这基本上应该在所需范围内生成每个可能的值。

顺便说一句,这些不是均匀分布的数字,至少不是该术语通常在数学中应用的方式。

于 2013-01-31T18:01:56.760 回答