簡體   English   中英

為什么從內存中插入的“隨機”數字通常非常大?

[英]Why are "random" numbers plugged from memory often extremely large?

有時在例如 C 代碼的開發過程中,您可能會意外地索引超出其最后一個元素的數組,從而導致讀取基本上“隨機”的內存塊。 我經常使用double數組,並注意到當這種情況發生時,從“隨機”內存產生的double通常非常大,如大於1e+300 我想知道這是為什么。

如果用於解釋double精度數的 64 位真的是隨機的,由於浮點數在內存中的布局方式,我希望double精度數的指數從0308均勻分布(忽略指數的符號)使用科學(指數)記數法。 當然,內存中隨機選擇的位的值本身並不是隨機分布的,而是對應於任何進程設置這些值的一些有意義的狀態。

為了研究這個效果我寫了下面的Python腳本3,圖表不僅真正隨機生成的分發double S和double從“隨機”,但使用的內存取S:

import random, struct
import numpy as np
import matplotlib.pyplot as plt

N = 10000

def random_floats(N=1):
    return np.array(struct.unpack('d'*N, bytes(random.randrange(256) for _ in range(8*N))))

def exp_hist(a, label=None):
    a = a[~np.isnan(a)]
    a = a[~np.isinf(a)]
    a = a[a != 0]
    if len(a) == 0:
        print('Zeros only!')
        return
    a = np.abs(np.log10(np.abs(a)))
    plt.hist(a, range=(0, 350), density=True, alpha=0.8, label=label)

# Floats generated from uniformly random bits
a = random_floats(N)
exp_hist(a, 'random')

# Floats generated from memory content
a = np.empty(N)
exp_hist(a, 'memory')

plt.xlabel('exponent')
plt.legend()
plt.savefig('plot.png')

運行此腳本的典型結果如下所示:

真正隨機生成的double的指數確實是均勻分布的。

從內存內容解釋的double的指數要么非常小,要么非常大。 事實上,大部分未使用的內存被清零,導致很多0值,這是有道理的。 然而,正如我經常從 out-of-bounce 內存訪問中遇到的那樣, 1e+300附近的很多值也出現了。

我想解釋一下大量的超大double

運行腳本的注意事項

如果您想自己試用該腳本,請注意您可能需要多次運行它才能顯示任何有趣的內容。 可能會發生從內存內容讀取的每個數字都是0 ,在這種情況下它會告訴你。 如果這種情況反復發生,請嘗試降低N (使用的double數)。

您可能會在內存中找到許多不同的東西,但其中有驚人的數量映射到非常大或非常小的浮點數、無窮大或 NaN。 在下文中,“FP”表示 IEEE 754 64 位二進制浮點數。

首先,因為它們已經在對該問題的評論中進行了討論,請考慮地址。 64 位地址通常所有指數位為零(內存低端),或所有指數位高(內存高端,通常是堆棧地址)。 如果所有指數位都為高,則它是無窮大或 NaN,程序似乎忽略了這一點。 如果所有指數位都為零,則它是次正規數或零。 次正規數都小於2.3E-308,算作指數308。

現在考慮 32 位整數,這是另一種非常常見的數據形式。 映射到有限 FP 的負 32 位二進制補碼整數為 -1048577 或更少。 -42 或 -1 之類的數字映射到 NaN,被程序忽略。 類似地,中等值正整數的所有指數位為零,因此映射到次正規數,映射到直方圖的大指數端。 即使是很小的正常數也對應於驚人的大整數。 例如,1e-300 的前 32 位具有整數值 27,618,847。

對於指針和整數,對所有具有相同值的指數位都有強烈的偏見,要么全為零,要么全為 1。 所有一個都是 NaN 或無窮大,不被程序計算在內。 所有零都是次正規的,算作非常大的指數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM