Microsoft ikili biçim veya IEEE; (tam) sorunları yuvarlama

Makale çevirileri Makale çevirileri
Makale numarası: 35826 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Özet

Bu makalede aşağıdaki konular açıklanır:

  1. Neden Microsoft yerine Microsoft ikili biçim (MBF) aşağıdaki ürünlerde bulunan IEEE kayan nokta biçimi kullanır:

    • Sürüm 4.00 veya yenisi yüklü ve 4.00b 4.50 IBM PC için Microsoft QuickBasic.
    • Microsoft temel Derleyicisi sürüm 6.00 ve 6.00b MS-DOS ve MS OS/2.
    • Microsoft temel PDS MS-DOS ve MS OS/2 sürüm 7.00.
  2. Kayan nokta IEEE biçiminde Microsoft ikili biçimi (MBF) arasındaki fark. Sayısal IEEE sorunları yuvarlama. Daha fazla bilgi için ayrı bir makale aşağıdaki sözcükler ara:
    IEEE öğreticisi ve yuvarlama
  3. IEEE Microsoft ikili biçim (MBF yerine) ileride kullanmak için Microsoft planlamaktadır.

Daha fazla bilgi

IEEE ve yuvarlama

  1. Neden IEEE MBF yerine kullanılır?

    IEEE, karma dil arama özellikleri için izin vermek için Microsoft derleyicisi 6.00 temel ve matematik paketi QuickBasic sürüm 4.00 veya yenisi yüklü seçildi. Bu özellik, çok uygun bir özelliktir. Ek olarak bu özellik, IEEE de Microsoft ikili biçim (MBF göre) daha doğru olur. Hesaplamaları bir 64-bit alanı yerine 80 bit alanı geçici olarak gerçekleştirilir. (Not, alternatif Math kitaplıkları kullanın 64-bit bir geçici alan.) Ek bitlerin daha doğru hesaplamalar için sağlamak ve son sonuç aşırı roundoff hatalarından degraded olasılığını azaltabilirsiniz. Duyarlık hatalarını herhangi bir ikili kayan nokta matematik devredilen aklınızda bulundurun. Tüm sayılar, bir kayan nokta ikili gösterimde doğru olarak temsil edilebilir.

    IEEE de bir matematik yardımcı işlemci yongasının yararlanabilirsiniz (the 8087 gibi 80287 ve 80387) yüksek hız için. MBF bir işlemci, yararlanamaz.
  2. Hesaplamaların daha doğru neden gibi numaralardır. 1'de 16th basamak görüntülenen 9.96 # 07 # ve 8.05 #? Microsoft ikili biçim (MBF) bu yapmaz.

    MBF 15 basamağa kadar olan IEEE 15 veya 16 basamağa kadar doğru. Numaraları farklı biçimlerde depolanmış olduğundan, son basamağını değişebilir. MBF çift duyarlıklı değerleri aşağıdaki biçimde depolanır:
          -------------------------------------------------
         |              |    |                             |
         |8 Bit Exponent|Sign|   55 Bit Mantissa           |
         |              | Bit|                             |
          -------------------------------------------------
    						
    IEEE çift duyarlıklı değerleri aşağıdaki biçimde depolanır:
          -------------------------------------------------
         |    |                | |                         |
         |Sign| 11 Bit Exponent|1|  52 Bit Mantissa        |
         | Bit|                | |                         |
          -------------------------------------------------
                                ^
                                Implied Bit (always 1)
    						
    Microsoft ikili biçim (MBF) 4, duyarlık, daha fazla bit mantis içinde olduğunu görürsünüz. Ancak, bu değeri artık doğru anlamına gelmez. Duyarlık doğruluk için gerçek sayı olan ne olmakla birlikte, çalıştığınız bit sayısıdır. Çoğu durumda, onu bir 80 bit geçici hesaplandığı için IEEE değerini daha doğru olacaktır. (IEEE) standardı, önerilen, ana dikkat etmeniz gereken değerleri çift duyarlıklı aralığı oldu. En az, the desire herhangi iki 32 bit sayı ürün 64 bit biçiminde taşma değil, olduğu.)
  3. Benim yuvarlama algoritması 1 's 16th yerinde ortadan neden görünmüyor?

    Sayıları, yuvarlama algoritması doğru olarak yuvarlama, ancak ek basamak devralınan yuvarlama hatalarını ve biçimi farklılıklar nedeniyle oluşup. Örneğin, 6.99999999999999D - 2 için.07 yuvarlanır ancak iç IEEE değeri 7.000000000000001D gösterimidir - 2. (MBF.07 görüntüler, ancak değerler arasındaki fark bir sorun olarak kabul edilir, bu durum geçerlidir. Bu bir matematik paketleri arasındaki farktır.)
  4. Neden STR $ işlevi uygun dizeleri tek veya çift duyarlıklı sayılar elde görünmüyor?

    STR $ işlevi düzgün çalışır. Dizede yerleştirilen ile biçimlendirilmemiş bir PRINT ekranda görüntülenen değerle aynı değerdir. IEEE.07 7.000000000000001D gösterimidir, - 2, daha sonra STR $ 7.000000000000001D döndürecektir - 2.

    Istenen bir dizeyi oluşturmak için birkaç yol vardır. Kullanılan yöntem, sayılar ve diğer kaynakları Programcı'nın tercih aralığının bağlıdır. Aşağıda, kullanılabilen üç olası yordamlar listelenmiştir. Dizesini bir sayıya dönüştürülür hemen sonra artık fazlalıklar atılacak olduğunu unutmayın.

    Yöntem 1

    Numara aralığı 2 arasında ise ^ 32/100 ve -2 ^ 32/100, aşağıdaki yöntemi kullanılır:
       FUNCTION round2$ (number#)
       n& = number# * 100#
       hold$ = LTRIM$(RTRIM$(STR$(n&)))
    
       IF (MID$(hold$, 1, 1) = "-") THEN
          hold1$ = "-"
          hold$ = MID$(hold$, 2)
       ELSE
          hold1$ = ""
       END IF
    
       length = LEN(hold$)
       SELECT CASE length
       CASE 1
          hold1$ = hold1$ + ".0" + hold$
       CASE 2
          hold1$ = hold1$ + "." + hold$
       CASE ELSE
          hold1$ = hold1$ + LEFT$(hold$, LEN(hold$) - 2)
          hold1$ = hold1$ + "." + RIGHT$(hold$, 2)
       END SELECT
       round2$ = hold1$
       END FUNCTION
    						
    yuvarlanan değeri 100 # ile çarpılır ve sonucu, uzun bir tamsay? depolanır. Uzun Tamsayı, dize dönüştürülür ve ondalık, doğru konuma eklenir.

    Yöntem 2

    Bir çok daha büyük değerler aralığını işlediği bu yordamı ilk yöntem, daha karmaşık olur. Yuvarlanan değeri 100 # ile çarpılır ve bu sonuç, geçerli bir çift duyarlıklı sayılar aralığı içinde sığması gerekir.
      FUNCTION round$ (number#) STATIC
       number# = INT((number# + .005) * 100#) / 100#
       hold$ = STR$(number#)
       hold$ = RTRIM$(LTRIM$(hold$))
    
       IF (MID$(hold$, 1, 1) = "-") THEN
         new$ = "-"
         hold$ = MID$(hold$, 2)
       ELSE
         new$ = ""
       END IF
    
       x = INSTR(hold$, "D")
       DecimalLocation = INSTR(hold$, ".")
    
       IF (x) THEN  'scientific notation
         exponent = VAL(MID$(hold$, x + 1, LEN(hold$)))
         IF (exponent < 0) THEN
           new$ = new$ + "."
           new$ = new$ + STRING$(ABS(exponent) - 1, ASC("0"))
           round$ = new$ + MID$(hold$, 1, 1)
         ELSE
           new$ = new$ + MID$(hold$, 1, DecimalLocation - 1)
           num = LEN(hold$) - 6
           IF num < 0 THEN
             num = exponent
           ELSE
             num = exponent - num
          new$ = new$+MID$(hold$, DecimalLocation+1, x-DecimalLocation-1)
           END IF
           new$ = new$ + STRING$(num, ASC("0")) + ".00"
           round$ = new$
         END IF
    
       ELSE  'not scientific notation
         x = INSTR(hold$, ".") 'find decimal point
         IF (x) THEN
           IF MID$(hold$, x + 3, 1) = "9" THEN
             xx = VAL(MID$(hold$, x + 2, 1)) + 1
             hold1$ = LEFT$(hold$, x)
             IF xx = 10 THEN
         hold1$ = hold1$+LTRIM$(STR$(VAL(MID$(hold$, x + 1, 1)) + 1))+"0"
               round$ = new$ + hold1$
             ELSE
               hold1$ = hold1$ + MID$(hold$, x + 1, 1) + LTRIM$(STR$(xx))
               round$ = new$ + hold1$
             END IF
           ELSE
             round$ = new$ + LEFT$(hold$, x + 2)
           END IF
         ELSE
          round$ = new$ + hold$
         END IF
       END IF
       END FUNCTION
    						

    Yöntem 3

    Bu yöntem, Microsoft C derleyicisi 5.x kullanımını gerektirir. Bu, C kitaplık yordamı sprintf() kullanır. Bu yordam, biçimlendirilmiş bir ekran çıkış alır ve bir dize değişkenine depolar.

    c yordamı:
       struct basic_string {
          int length;
           char *address;
           } ;
    
         void round(number,string)
         double *number;
         struct basic_string *string;
         {
         sprintf(string->address,"%.2f",*number);
         }
    						
    temel program:
       DECLARE SUB Round CDECL (number#, answer$)
       CLS
       b# = .05#
       FOR i = 1 TO 10
            b# = b# + .01#
            answer$ = SPACE$(50)
            CALL Round(b#, answer$)
            PRINT b#, LTRIM$(RTRIM$(answer$))
            PRINT
            cnt = cnt + 4
            IF cnt > 40 THEN
               cnt = 0
               INPUT a$
            END IF
       NEXT i
    						
    ekran aynı biçimlendirmeyi Basic'ın PRINT KULLANMAYı deyimi ile gerçekleştirilebilir. Ancak, Basic, bu bilgileri bir dize, doğrudan bir araç vardır. Bilgiler sıralı bir dosyaya gönderilir ve olması dize değişkenleri ' [NULL]'ı okuyun.

    Ayrıca bilgileri ekrana yazabilir ve SCREEN işlevini kullanarak bu bilgileri okunamıyor. SCREEN işlevi, belirtilen ekran konumu <a1>ASCII</a1> değerini verir. Aşağıdaki örneği inceleyin:
       x# = 7.000000000000001D-02
       CLS
       LOCATE 1, 1
       PRINT USING "#################.##"; x#
       FOR i = 1 TO 20
       num = SCREEN(1, i)
       SELECT CASE num
         CASE ASC(".")
           number$ = number$ + "."
         CASE ASC("-")
           number$ = "-"
         CASE ASC("0") TO ASC("9")
           number$ = number$ + CHR$(num)
         CASE ELSE
       END SELECT
       NEXT i
       PRINT number$
    						
    17 boşluklar'ı ve sonra.07 PRINT KULLANMAYı deyimi görüntüler. Değer sayı $.07 olacaktır.
  5. Microsoft Basic gelecekteki sürümlerinde Microsoft ikili biçim (MBF) kullanmayı mu?

    Şu anda planlanmamaktadır MBF için geri dönün. IEEE (interlanguage arama ve destek işlemcisi) yararları daha fazla olanları MBF var.

Özellikler

Makale numarası: 35826 - Last Review: 11 Şubat 2014 Salı - Gözden geçirme: 1.2
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt KB35826 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:35826

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