Hafızada şamandıra temsilini açıklayan var mı?


20

Önceki soruyu okuduğumda bu yinelenen bir soru değil.

Herkes yardım bana anlayış Can how float values are stored in the memory.

Şüphem burada kayan değerler ' .'( for example 3.45) '.'bellekte nasıl temsil edilecek içerir' içerir ?

Birisi bana bir şema ile netleştirebilir mi?


21
En az beklenen kaynağa ne dersin, Wikipedia? en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
Ve ana makaleyi ekleyebilirsiniz: IEEE kayan nokta
mouviciel

4
Benim gibiyseniz ve bir şeyler oynayarak, girdiler koyarak ve çıktılar alarak vb. Öğrenmek istiyorsanız, bu siteyi ziyaret edin: binaryconvert.com/convert_double.html
KChaloux

Hepsi farklı, geniş bir kayan nokta biçimi çeşitliliği vardır. IEEE kayan noktası günümüzde en yaygın olanıdır, ancak tek değildir. Lisans alırken CDC 6600 kayan nokta biçimini öğrenmek zorunda kaldım ve IEEE'ye göre bazı avantajları vardı, en büyüğü tek kesinlik için 48 bit mantis. IEEE, tek kesinlik için yaklaşık 24 bit mantis ile sınırlıdır, bu nedenle bu günlerde her giriş sayısal yöntem sınıfı öğrencilere "Her zaman şamandıra değil, çift kullanın" der.
John R. Strohm

Yanıtlar:


44

Ondalık nokta hiçbir yerde açıkça saklanmaz; bu bir görüntüleme sorunu.

Aşağıdaki açıklama basitleştirmedir; Birçok önemli ayrıntıyı bırakıyorum ve örneklerim herhangi bir gerçek dünya platformunu temsil etmiyor. Kayan nokta değerlerinin bellekte nasıl temsil edildiğine ve bunlarla ilişkili sorunlara bir lezzet vermelidir, ancak Her Bilgisayar Bilimcisinin Kayan Nokta Aritmetiği Hakkında Bilmesi Gerekenler gibi daha yetkili kaynaklar bulmak isteyeceksiniz .

Başlangıç ​​olarak, 10 no'lu taban yerine 2 temel notayı kullanarak bilimsel gösterimin bir varyantında bir kayan nokta değerini temsil ederek başlayın. Örneğin, 3.14159 değeri şu şekilde temsil edilebilir:

    0.7853975 * 2 2

0.7853975 anlamlı , yani mantis; sayının anlamlı rakamları içeren kısmıdır. Bu değer, 3.14159'u elde etmek için 2 gücüne yükseltilmiş taban 2 ile çarpılır.

Kayan nokta sayıları, anlamlı ve üs (bir işaret bitiyle birlikte) depolanarak kodlanır.

Tipik bir 32 bit düzen aşağıdakine benzer:

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

İşaretli tamsayı türleri gibi, yüksek dereceli bit de işareti belirtir; 0, pozitif bir değeri, 1, negatifi belirtir.

Sonraki 8 bit üs için kullanılır. Üsler pozitif veya negatif olabilir, ancak başka bir işaret biti ayırmak yerine, 10000000'in 0'ı temsil ettiği şekilde kodlanırlar, böylece 00000000 -128'i ve 11111111 127'yi temsil eder.

Kalan bitler anlamlılık için kullanılır. Her bit, soldan 2 sayım negatif gücünü temsil eder, bu nedenle:

    01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2-4 + 1 * 2-5 
          = 0,25 + 0,125 + 0,03125 
          = 0.40625

Bazı platformlar her zaman 1 değerine ayarlanmış olan anlamda "gizli" bir öncü bit olduğunu varsayar, bu nedenle anlamdaki değerler her zaman [0.5, 1) arasındadır. Bu, bu platformların değerleri biraz daha yüksek bir hassasiyetle depolamasına olanak tanır (daha fazla aşağıda). Örneğim bunu yapmıyor.

Yani 3.14159'umuzun değeri,

    0 10000010 11001001000011111100111
    ^ ^ ^
    | | |
    | | + --- anlamlı = 0.7853975 ...
    | |
    | + ------------------- üs = 2 (130-128)
    |
    + ------------------------- işareti = 0 (pozitif)

    değer = -1 (işaret) * 2 (üs) * (anlamlı)
    değer = -1 0 * 2 2 * 0.7853975 ...
    değer = 3.14159 ...

Şimdi, tüm bitleri anlamlı olarak eklerseniz fark edeceğiniz bir şey, toplam 0.7853975; aslında 0.78539747'ye çıkıyorlar. Değeri tam olarak depolamak için yeterli bit yok ; yalnızca yaklaşık bir değeri saklayabiliriz. Anlamlı olan bit sayısı hassasiyeti veya kaç önemli basamak saklayabileceğinizi belirler. 23 bit bize yaklaşık 6 ondalık basamak hassasiyeti verir. 64 bit kayan nokta türleri, yaklaşık 12 ila 15 basamak hassasiyet sağlamak için anlamlı olarak yeterli bitler sunar. Ancak, nasıl olursa olsun tam olarak temsil edilemeyen değerler olduğunu unutmayınkullandığınız birçok bit. 1/3 gibi değerler sonlu ondalık basamaklarla temsil edilemediğinde, 1/10 gibi değerler sonlu sayılarda gösterilemez. Değerler yaklaşık olduğundan, onlarla hesaplamalar da yaklaşıktır ve yuvarlama hataları birikir.

Üsteki bit sayısı aralığı belirler (temsil edebileceğiniz minimum ve maksimum değerler). Ancak minimum ve maksimum değerlerinize doğru ilerledikçe, temsil edilebilir değerler arasındaki boşluğun boyutu artar. Yani, 0.785397 ile 0.785398 arasındaki değerleri tam olarak temsil edemezseniz, 7.85397 ile 7.85398 arasındaki değerleri veya 78.5397 ile 78.5398 arasındaki değerleri veya 785397.0 ile 785398.0 arasındaki değerleri tam olarak temsil edemezsiniz. Çok büyük (büyüklük açısından) sayıları çok küçük sayılarla çarparken dikkatli olun.


"ancak başka bir işaret biti ayırmak yerine" Tanımladığınız şey, işaretli bir tam sayının tam davranışıdır.
Simon

6

.Hiç saklanmaz. İlk olarak, bir sabit hassasiyet faktörü ve bir tamsayı üssü olan mühendislik gösterimini anlamalısınız: 11.0 · 10 0 = 1.0E0, 2 2.0E0, 10 1.0E1vb. Bu, büyük sayıların çok kısa gösterilmesine izin verir. Bir milyar 1.0E9. Önce bir faktör E, genellikle sabit bir hassasiyete sahip bir sayı olarak notated edilir: 1.00000E9. Bunun bir sonucu , hassasiyet yeterince büyük olmadığında, bu göstergede bir milyar ve bir = 1.000.000.001 ve bir milyar sayısının aynı olmasıdır. Ayrıca, faktörün asla sıfır değerine ihtiyacı olmadığını unutmayın. Bunun yerine, üs artık geçerli olana kadar azaltılabilir.

Bellekte, bir kayan nokta numarası benzer şekilde temsil edilir: Bir bit işareti vardır, bazı bitler faktörü sabit hassasiyetli bir sayı ("mantis"), geri kalan bitler üs oluşturur. Taban-10 mühendislik notasyonundaki önemli farklılıklar, elbette üssün taban 2'ye sahip olmasıdır. Her parçanın tam boyutu, kullandığınız tam kayan nokta standardına bağlıdır.


3
Bu "Bilimsel gösterim" dir. "Mühendislik notasyonu" üs 3'ün katları ile sınırlı olduğunda.
Clement J.

7
Baz 2'nin kullanılması çok önemlidir. Bu değer tıpatıp saklanabilir ve belirler hangi değildir ve bir sezgi geliştirmek için rahatsız olamaz bile hangi değerlerin en az o ondalık rakam tamamen yararsız hatırlamalıyız (I can not biliyorum) hakkında düşünmenin yolu.

1
@delnan: Eğer yardımcı olursa, mantis içindeki her bit yüksek bitin yarısı kadardır. Böylece, şamandıralar iki negatif gücün toplamını depolayabilir: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 ve benzeri, mantis sınırına kadar . Yani bir 32-bit epsilon floatolduğu 2^-22 * exponentveya 1/4194304 hakkında.
greyfade
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.