浮点数( 二 )


浮点数

文章插图
浮点数 就只有一个“随机”的浮点数而言,讨论其分散式没有意义的,我们要讨论的是充分多个“随机”数进行的一系列运算后产生的浮点结果的前导数字分布 。假设现在有一巨大的浮点数集,依此对数集中每个浮点数都乘以2,其中有一个十进制浮点数F,它的前导数字是1,那幺它底数可能的值範围就是1.000…~1.999…,乘以一个数字2,那幺它的底数就变成2.000…~3.999…,很明显乘以2以前前导数字是1的浮点个数与现在前导数字是2、3的浮点个数相同 。以此我们接下来分析 。对于一个b进制的浮点数,它的前导数字x範围就是0 < x < b,设f(x)是上述数集的前导数字的机率密度函式(注:是密度函式),那幺它在前导数字u和v之间(0<u<v<b)的机率就是:∫[u,v]f(x)dx ⑴由前面所述的,对于一个充分小增量Δx,f(x)必须满足这样一个公式:f⑴Δx = x*f(x)Δx ⑵因为:f⑴Δx是f⑴微分段内的机率,根据前面所述,f⑴Δx机率等于f(1*x)*(x*Δx)很明显:f(x) = f⑴/x ⑶两边在[1,b]之间进行积分,等号左边必定为1,右边等于f⑴ln(b):1 = f⑴ln(b) ⑷得:f⑴ = 1/ln(b) 带入⑶中:f(x) = 1/(x*ln(b))那幺利用⑴式得:∫[u,v]1/(x*ln(b))dx= ln(v/u) / ln(b) ⑸这就是求前导数字的机率分布函式 。例如b = 10进制时,前导数字为1的机率就是:= ln((1+1)/1) / ln⑽≈ 0.301前导数字为9的机率就是:= ln((9+1)/9) / ln⑽≈0.0458以下是一个测试程式(Mathematica软体):T[n_,b_]:=Block[{res={},ran,i,a},For[i=1,i<b,i++;res=Append[res,0]];For[i=0,i<n,i++;ran=Random[]*Random[]*Random[]; 充分打乱浮点数ran=Log[b,ran];a=Floor[b^(ran-Floor[ran])]; 取出前导数字res[[a]]++ 对前导数字个数统计];Return[res]]执行T[100000,10],以10进制测试100000个浮点数,得到一个分布:{30149,18821,13317,9674,7688,6256,5306,4655,4134}和理论值相当接近 。