我正在尝试在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
发布于 2013-02-01 02:01:57
(看在上帝的份上,看在小青苹果的份上,你为什么要这样做呢?)
我的观点是,使用MATLAB的功能来做这件事。学习使用向量和数组。将运算应用于整个数字数组。这就是像MATLAB这样的工具的闪亮之处。在此之前,您还不如使用低级语言,但没有使用低级工具所带来的速度优势。
好了,我们该如何解决这个问题呢?
使用三个不同的随机值生成每个数字。
使用向量运算完成所有这些操作。
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
假设我对每个部分的范围都是正确的,这基本上应该在所需的范围内生成每个可能的值。
顺便说一句,这些不是均匀分布的数字,至少不是数学中通常应用的方式。
https://stackoverflow.com/questions/14631303
复制相似问题