(Tamamlar) Kayan nokta hatalarını IEEE öğrenin için Öğreticisi

Makale çevirileri Makale çevirileri
Makale numarası: 42980 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Kayan nokta matematiğini fazla programcılar confuses karmaşık bir konudur. Öğretici aşağıdaki programlama durumlarda kayan nokta hatalarını nerede oluşabilir ve bunları nasıl yardımcı olmalıdır. Bu ayrıca, gerçek bir derleyici hataları karşıt olarak devralınan bir kayan nokta matematik sınırlamaları nedeniyle, servis taleplerini tanıması izin vermelisiniz.

Daha fazla bilgi

Ondalık ve ikili sayı sistemleri

Normal olarak, temel 10 şey say. Tümüyle rasgele tabanıdır. Kişilerin Geleneksel olarak temel 10 kullandığınız tek nedeni, kullanışlı bir sayım araçları yaptınız ve 10 fingers olduğunu olur.

Ondalık (10 tabanı) sayı 532.25 aşağıdaki oldu?u anlam?na gelir:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Ikili sayı sisteminde (2 tabanı), her sütun yerine, 10, 2'in üssü temsil eder. Örneğin, 101.01 numarasını aşağıdaki anlam?na gelir:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Tamsayılar bilgisayarların nasıl gösterilir

Hiçbir kesirli bölümü için bir tamsayı olduğundan, makine gösterimi için kayan noktalı değer olandan çok daha kolaydır. Normal (bilgisayarlar) kişisel bilgisayarlarda 2 baytlık (16 bit) işareti gösteren uzun en anlamlı bit tamsayılardır. 4 Bayt uzunluğunda tamsayılardır. Basit bir ikili sayı pozitif değerlerdir. Örneğin,:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Ancak, negatif tamsayılara iki bilgisayarın tamamlayıcı düzeni kullanılarak temsil edilir. Iki bilgisayarın tamamlayıcı gösterimi negatif bir sayı elde etmek için <a0></a0>, numarasını, bilgisayarın mutlak değeri için bir ikili gösterimini alır ve tüm bit çevirme ve 1 ekleyin. Örneğin,:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Bu -1 Not ondalık 1111 1111 = neden Basic -1 mantıksal doğru olarak nitelendirir açıklar, ikili, 1111 1111 (tüm bitleri = 1). Bu karşılaştırmalar, bitwise ve mantıksal işleçleri ayrı sahip bir sonucu olacaktır. Genellikle Basic'te kod parçası olduğunda çok sayıda mantıksal karşılaştırmalar programınızı yapacak aşağıda kullanmak uygun olur. Bu büyük ölçüde yardımlar okunabilirlik.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Iki bilgisayarın herhangi bir birleşimi ekleme sıradan ikili aritmetik kullanarak sayıları tamamlayıcı Not doğru sonuç üretir.

Floating-Point zorluklar

Her bir ondalık tamsayı ikili bir tamsayı tam olarak gösterilebilir; ancak bu kesirli sayılar için doğru değil. Aslında, 10 tabanına ırrational her sayı de ırrational herhangi bir sistem ile temel 10'dan daha küçük olur.

Ikili için özellikle, the form p/q 2 bir tamsayı güç olduğu q içinde gösterilebilen yalnızca kesirli sayı tam olarak sınırlı bir bit sayısı ile ifade edilebilir.

0,0001 ondalık değeri gibi sık kullanılan ondalık kesirler bile ikili düzende tam olarak gösterilemez. (nokta 104 bit yinelenen ikili bir kesir 0.0001 olur!)

Bu basit bir örnek neden, aşağıdaki gibi açıklar
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

PRINT 1.000054 çıktı verir. 0,0001 değerini ikili düzende gösterirken ortaya çıkan küçük hata, toplamı etkiler.

Aynı nedenle, her zaman karşılaştırmaları reel sayılar üzerinde yaparken çok dikkatli olmalısınız. Aşağıdaki örnekte, ortak bir programlama hatası gösterilmektedir:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

(Ikili sistemde) BIRAZ farklı atama kaynaklanır değeri neden tam olarak ikili düzende, 69.82 gösterilemez çünkü bu "Eşitlik!" PRINT NOT değerden deyim oluşturulur. Uygulamada, her zaman bazı toleransını izin verecek şekilde şekilde tür karşılaştırmalarda kodu. Örneğin,:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Bu, "Eşit" PRINT.

IEEE biçim numaraları

MS-DOS sürüm 3.0 için QuickBasic bir MBF (Microsoft ikili kayan nokta) sürümünü ve bir IEEE (ınstitute of Electrical and Electronics Engineers) sürümünü matematik işlemcisi ile makineler için sevk. MS-DOS için QuickBasic, 4.0 ve sonraki sürümler IEEE kullanmalısınız. Microsoft, kayan nokta temel geçerli sürümlerinde aşağıdaki üç birincil nedenlerle göstermek için IEEE standart seçtiniz:
  1. Basic ıntel matematik coprocessors hangi kullanım IEEE biçiminde kullanmak izin vermek için <a0></a0>. Intel 80 x 87 serisi coprocessors Microsoft ikili biçimi numaraları ile çalışamaz.
  2. Interlanguage Basic, C, Pascal, FORTRAN MASM arasında ve çok daha kolay bir arama yapmak için <a0></a0>. Aksi halde, dönüştürme yordamlar, sayısal değerler bir dilden göndermek için kullanılacak gerekir.
  3. Tutarlılık sağlamak için <a0></a0>. IEEE, C ve FORTRAN derleyiciler için kabul edilen endüstri standardıdır.
IEEE ve MBF temsili bir çift duyarlıklı numarası için hızlı bir karşılaştırmasını şudur:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

IEEE ve MBF kayan noktalı gösterimi, <a1>sorgu</a1> Microsoft Knowledge Base'de bulunan aşağıdaki sözcükler arasındaki farklar hakkında daha fazla bilgi için:
   IEEE and floating and point and appnote
				

IEEE sağlayan daha geniş bir aralıkta bulunan değerleri temsil etmek için üs değeri için ayrılmış olan daha fazla bit olduğunu unutmayın. Dar, aralık içinde daha kesin olmasını sağlayan daha fazla mantis bitleri, MBF var.

Kayan nokta olan genel kavramlar

Kayan noktalı değer tam formunda yalnızca sınırlı sayıda ikili herhangi bir kayan nokta sistemi temsil edebilir gerçekleştirmek çok önemlidir. Diğer tüm değerler en yakın gösterilebilir değeriyle yaklaşık gerekir. IEEE) standardı, değerleri "en yakın" gösterilebilir değere yuvarlama yöntemi belirtir. MS-DOS için QuickBasic standardını destekler ve IEEE kurallarına göre yuvarlar.

Ayrıca, sayıları IEEE temsil edilebilir çok çeşitli üzerinde dağılmış göz önünde bulundurun. Bunları bir numarası satırına düşünün. Bir yüksek yoğunluklu 1.0 ve -1.0, 0. 0'a yakın gösterilebilir numaraları yoktur, ancak daha az olarak 0 veya sonsuz doğru gidin.

Hesaplamalar mühendislik için tasarlanmış olan, IEEE standart amacı doğruluğunu en üst düzeye çıkarmak için olan (almak için olabildiğince fiili olarak yakın numarası). Duyarlık için temsil edebilen basamak sayısını gösterir. Standart IEEE bit üs için ayrılmış doğruluğu hem de duyarlık kabul edilebilir sınırlar içinde tutmak için sayının kesirli kısmı için kullanılan bit sayısı ile bakiyelendirmek çalışır.

IEEE ayrıntıları

Kayan noktalı sayıların burada [] ikili üs üstür aşağıdaki formunda gösterilir:
   X =  Fraction * 2^(exponent - bias)
				

[Kesir] üs, önde gelen kill bitini her zaman 1 olacak şekilde ayarlanır, çünkü normalleştirilmiş sayının normalleştirilmiş kesirli bölümü var. Bu şekilde, depolanması gerekmez ve duyarlık bir daha fazla bit alın. İşte bu nedenle de örtülü bir değeri vardır. Bu gibi bilimsel gösterimde, burada ikili düzende, olması dışında bir rakam, ondalık virgülün solunda üs değeri'ni değiştirmek yalnızca 1s ve 0s olduğundan ilk bit 1, böylece her zaman üs işleyebileceğiniz düşünebilirsiniz.

[sapma], negatif üs sayıların saklamak zorunda kalmamak için kullanılan sapma değeridir.

Tek duyarlıklı sayıların sapma 127 ve çift duyarlıklı sayılar için (ondalık) 1023 ' dir.

Değerleri tüm 0'ın eşit ve hepsi 1'lerin (ikili) özel durumlar temsil eden için rezerve edilir. Çeşitli hata durumlarını gösteren diğer özel durumlar gibi vardır.

Tek duyarlığı örnekleri

2 = 1 * 2 ^ 1 0100 0000 = 0000 0000 0000-0000, 4000-0000-hex =
<a1>Not</a1> biti sıfırdır ve saklı ikili, 128 veya 100 0000 0 127 artı 1 olduğu üstür. (1) 000 Saklı mantis ise asıl mantis 1 olacak şekilde... 0000 örtülü bir satır 1 ve ikili olan 0000 0000, işaretleyin.

-2 = -1 * 2 ^ 1 1100 0000 = 0000 0000 0000-0000 C000 0000 hex =
Aynı + 2 biti ayarlanmış olmasıdır. Bu, tüm IEEE kayan noktalı sayıları biçimlendirme için geçerlidir.

4 = 1 * 2 ^ 2 0100 0000 = 1000 0000 0000-0000 4080 0000 hex =
Aynı mantis, tek (ağırlıklı ikili 129 veya 100 0000 1 değeridir. üs değeri artırır.

6 = 1.5 * 2 ^ 2 0100 0000 = 1100 0000 0000-0000, 40 = 0 C 0000 hex
Aynı üs değeri mantis yarı göre daha büyük--(1) 100 Günlerden 0000... Bu ikili bir kesir olduğundan olan, 1-1/2 0000 0000 (ondalık basamakların değerlerdir 1/2, 1/4, 1/8, vs.).

1 = 1 * 2 ^ 0 0011 1111 = 1000 0000 0000-0000 3F80 0000 hex =
Mantis aynı üs değeri olarak başka tabanların 2 olan bir ikili dosyada 127 veya 011 1111 1, 2'den daha az.

.75 = 1.5 * 2 ^ -1 = 0011 1111 0100 0000 0000-0000 3F40 0000 hex =
Eğimli üstür 126, 011 1111 0 içinde ikili mantis ise (1) 100 0000... 1-1/2 0000 0000.

2,5 = 1.25 * 2 ^ 1 0100 0000 = 0010 0000 0000-0000 4020 0000 hex =
Tam olarak aynı 2, hariç, 1/4 temsil eden bit mantis ayarlanır.

1.6 = 0, 1 * 2 ^ -4 = 0011 1101 1100 1100 1100 1101 3DCC CCCD hex =
1/10 ikili düzende yinelenen bir kesir ' dir. Mantis 1.6 yalnızca shy; ağırlıklı üs 1.6 16 göre bölünür olduğunu belirten (011 1101 olarak 123 ondalık olan ikili, 1). Doğru üstür 123-127 = - 4 ile çarpmak faktör 2 ** -4 = 1/16 oldu?u anlam?na gelir. Not saklı mantis son kill bitini yukarı yuvarlanır. Olası doğru unrepresentable numarayı temsil eden denemesi budur. (Bunun nedeni, 1/10 ve 1/100 ikili düzende tam olarak gösterilebilir benzer şekilde, 1/3 ondalık düzende tam olarak gösterilebilir olduğunu,.)

0 = 1.0 * 2 ^-128 tümüyle sıfırlardan--özel bir durum =.

Diğer ortak kayan nokta hatası

Kayan nokta olan sık karşılaşılan hatalar şunlardır:
  1. Hata, yuvarlama

    Ikilik tabandaki bir sayıyı biti tümünün bir hesaplamasında kullanılamaz olduğunda bu hata oluşur.

    Örnek: 0.0001 0.9900 (tek duyarlığı) için ekleme

    Ondalık 0.0001 olarak temsil:
    (1) 10100011011011100010111 * 2^(-14+Bias) (13 0s ikili satır aralığı!)
    0.9900 olarak temsil:
    (1) 11111010111000010100011 * 2^(-1+Bias)
    Şimdi gerçekten bu numaraları eklemek için <a0></a0>, ondalık noktalar (ikili) hizalı gerekir. Bu olmaları gerekir Unnormalized. Oluşturulan ek aşağıdadır:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    olarak kaydırma yaptığınızda, bazı bilgisayarlarda yuvarlamak için bu yuvarlama hata verilir. Diğerlerinin yalnızca kesecek. Yuvarlak - göz önüne almanız gereken önemli hatalar her ekliyor veya iki farklı değerleri çarpmadan.
  2. Iki çıkarılmadan hemen hemen eşit değerler
           .1235
          -.1234
           _____
           .0001
    
    						
    bu normalleştirilmiş. Özgün numaralarını her dört anlamlı basamağa sahip olsa da, tek önemli basamak sonucu olduğunu unutmayın.
  3. Taşma ve Yetersizlik durumu

    Bu, çok büyük veya çok küçük veri türünü temsil sonucu olduğunda oluşur.
  4. Hata quantizing

    Bu, tam bir formda kayan nokta standardına göre temsil numaraları ile oluşur.
  5. Çok küçük bir sayıya bölme

    Bu bir "sıfıra bölme" hatası tetiklenebilir ya da, aşağıdaki örnekte olduğu gibi hatalı sonuçlar üretebilir:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    gelen QuickBasic şimdi X, MS-DOS için 900000 doğru yanıtı yerine, 888887 değeri vardır.
  6. Çıktı hatası

    Çıkış işlevlerini birlikte çalışma değerlerini değiştirdiğinizde, bu tür bir hata oluşur.

Özellikler

Makale numarası: 42980 - Last Review: 16 Ağustos 2005 Salı - Gözden geçirme: 3.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 for MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft Cinemania 97 Standard Edition
Anahtar Kelimeler: 
kbmt KB42980 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:42980
Kullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com