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

Ö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.

35826
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Ö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.
QuickBas BasicCom

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 35826 - Son İnceleme: 02/11/2014 21:39:15 - Düzeltme: 1.2

  • 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
  • kbnosurvey kbarchive kbmt KB35826 KbMttr
Geri bildirim