Ver*_*ian 2 random floating-point matlab numbers
我试图在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)
Run Code Online (Sandbox Code Playgroud)
这是输出:
minimum =
-3.4026e+038
smallest =
8.4046e+033
maximum =
3.4027e+038
Run Code Online (Sandbox Code Playgroud)
小智 5
(为什么以神的名义和小绿苹果你会在循环中这样做?)
我的观点是,使用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;
Run Code Online (Sandbox Code Playgroud)
它们涵盖了整个范围吗?看来是这样.
min(abs(R))
ans =
7.44202895026248e-41
max(R)
ans =
3.17337113940593e+38
min(R)
ans =
-3.3810631675676e+38
Run Code Online (Sandbox Code Playgroud)
假设我得到了每个部件的正确范围,这应该基本上产生所需范围内的所有可能值.
顺便说一句,这些不是均匀分布的数字,至少不是通常在数学中应用的术语.
| 归档时间: |
|
| 查看次数: |
1571 次 |
| 最近记录: |