Makale numarası: 126455 - Son Gözden Geçirme: 09 Aralık 2003 Salı - Gözden geçirme: 2.0

Yuvarlama kaçının nasıl & taşması Probs üzerinde Pentium işlemci

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Intel Corporation iki küçük tamsayı sayı kayan nokta değeri dönüştürme kayan noktası tamsayı deposu (FIST) yönergenin kullanırken ilgili Pentium işlemci hataları belirlemiştir. Bu hatalar, dar aralığı aşıyor, kayan nokta sayı için özel durum işleme içeren ve altı belirli işlenenleri iki yuvarlama modunda beklenmeyen davranışı içerir. Programcılar, ilk hata değerleri dönüştürmeden önce denetleme aralığı tarafından kolayca çalışabilirsiniz. Programcılar, ikinci hata modları yuvarlama varsayılan geçersiz kurtulabilirsiniz.

Daha fazla bilgi

Farklı dillerde, kayan nokta arasında dönüştürme tamsayıya farklı şekillerde tanıtıcısı. C, C++ ve FORTRAN büyük olasılıkla güvenli programlardır; diğer bir deyişle, bunlar tarafından Programcı modları yuvarlama açık değişiklik olmadan etkilenme olasılığı değil. Hataların tarafından etkilenme olasılığı daha temel programlardır.

Uygulama programları, genellikle etkilenmez. Uygulamalar ilgili hata denetimini içerir ve özel durumlar kurtarmak için uygun eylemi. Bunu yapmak için <a0></a0>, uygulamaları açık aralığı, dönüştürme öncesinde denetimi yapın veya açık bir özel durum işleme uygulamanız gerekir. Bir uygulamanın açık bir özel durum işleme üzerine dayanır, hata oluşuyor olasılığını var demektir. Özel durum işleme kullanan bir dilde yazılmış uygulamalar, büyük olasılıkla denetimi, böylece bir performans nedenleriyle yok onay</a1> seçeneğiyle Derlenecek uygulamanın izin verme aralığı kullanır.

FIST genel bakış

FIST yönergesi, kayan nokta sayıları imzalı kesirli kısımları atılarak tamsayıya dönüştürmek için kullanılır. Bir tamsayı değişken bir kayan nokta atandığında, örneğin, bir programda C veya FORTRAN, değer, değer saklanan önce atılarak tamsayıya gerekir. Kayan nokta tamsayıya gelen diğer dönüşümleri de olasıdır; örneğin, temel ve Pascal kesirli bölümü kesiliyor yerine yuvarlanacak.

FIST yönergenin dört yuvarlama moddan birinde çalışır: kesme (olarak da bilinen kesilmesinden), (en yakın veya eşit) en yakın yukarı ve aşağı. En yakın Basic kullanır, ancak C FORTRAN tarafından gerçekleştirilen varsayılan türü dönüşümlerinin modunda, yuvarlama kesme kullanın. Işlemci, giriş işlenen bir tamsayı olarak, bir <a0>Duyarlık</a0> <a1>Durum</a1> (PE) bayrağı olup olmadığını gösterir. PE bayrağı dönüştürülecek sayı bir tamsayı olmadıysa true olarak ayarlanır; yani bir kesirli bölümü sahip olduğu. Aksi halde değişmemiş olacaktır. Yuvarlama etkisini yuvarlama <a1>yönünü</a1> (C1) bayrağı gösterilir. Bir giriş değeri, büyük bir boyutları ile ilgili bir sayıya yuvarlanır C1 bayrağı ayarlanır; aksi halde, temizlenir.

FIST, 16, 32 veya 64 bitlik imzalı tamsayı kayan nokta sayıları dönüştürür. Kayan bir aralık için işaret numarası bazı biçimlerinden herhangi biri bu, büyük olduğundan noktası numaralarını kayan kesirli kısımları atılarak tamsayıya dönüştürülemez. Bir özel durum (Bu durumda, geçersiz işlem özel durum (IE)) için 16 bitlik bir tamsayı 32768.5 dönüştürme denemesi olur; böylece, en büyük 16-bit 32767, tamsayıdır. Özel durum işleme kayan, özel durum maskesi tarafından denetlenen denetim kaydı'nı işaretleyin. Geçersiz işlem özel durum maskesi ayarlı ise, özel durum maskelenmiş, aksi halde, bunu maskelenmemiş.

Örneğin, Microsoft Windows sürüm 3.1 altında çalışan uygulamaların tüm kayan nokta özel maskelenmiş ile başlar. Farklı uygulamalarda özel durum maskeleri değiştirmek ve kendi özel durumları işleme yöntemlerini sağlar. Örneğin Microsoft Visual C++ geçersiz işlem özel durum maskelenmiş duyarlık özel durum bırakarak maskelenmemiş, ayarlar. C++ ile geliştirilen bir uygulama özel durumu işlemeyi değiştirmediği takdirde, sınırların dışında bir sayıyı dönüştürmek bir FIST yönergesi çalıştığında görünür bir açılır pencere görürsünüz.

Algılanmayan taşması

ıntel tarafından kayan dönüştürme FIST yönergelerinde BIR hata saptanmıştır nokta sayısı için herhangi bir 16 veya 32 bitlik işaretli tamsayı. 64-Bit bir tamsayıya depolayan FISTP yönergenin bu açıktan etkilenmez. Hata noktası değerlerini aşımı sınırları bölgenin kayan sınırlı bir aralık için bir yuvarlama modu "en yakın" ayarlandığında veya "yukarı" oluşur. Özel durum maskesi ne olursa olsun, bu aralık için 0 değeri, belleğe yazılır, PE bayrağı ayarlandı, IE bayrağı ayarlı değildir ve hiçbir IE özel durum oluşturuldu.

Aşağıdaki şekil BIR nokta değerleri kayan ve B kesirli kısımları atılarak tamsayıya dönüştürülür. Değerleri bu aralığın dışında bir özel durum yükseltmeniz. Bu hata yalnızca C ve D aralığı değerlerini etkiler.

16-Bit FIST
                                                 65535.5 -
          -32768.5     0      32767.5            65536.0
<-------------[--------|--------]-------------------|-------->
   overflow       Normal Range        overflow
              A                 B                   C

32-Bit FIST
                                                          4,294,967,295.5 -
      -2,147,483,648.5     0      2,147,483,647.5         4,294,967,296.0
<-------------[------------|------------]-----------------------|-------->
   overflow           Normal Range             overflow
              A                         B                       D
				

Örneğin, izin verilen aralığın dışında bir 32 bitlik imzalı tamsayı, 4,294,967,295.7 gibi çok sayıda alın. Bu, matematiksel 4,294,967,296 yuvarlanır. Hata nedeniyle, Pentium işlemci için bu numarayı bir özel durum yükseltmenizi değil. Yalnızca 0 belleğe yazar ve değil denetimi için bir işleyici aktarmak veya IE bayrağı yükseltin.

Uygulamaları Microsoft Visual Basic kullanın.

Microsoft Visual Basic, karma türü işlemleri işlemek için veri türlerini otomatik olarak yükseltir. Bu, çoğu durumda için taşma koşulunu engeller. Örneğin,:
   IntX = SngY*IntZ
   IntX = 65535.7*2
				

Ancak, örtülü dönüşüm etkilenip etkilenmedikleri sınanmamıştır. Aşağıdaki Visual Basic sürüm 3.0 kod işlemcinin bağlı olarak farklı sonuçlar üretir:
   Dim X As Integer
   Dim Y As Single
   Y = 65535.5
   X = Y
   MsgBox Cstr(X)
				

Yukarıdaki kod, bir çalışma zamanı hatası 6 "Taşması" iletisine neden. Pentium işlemci tabanlı bir bilgisayara, bu kodu, sıfır (0) bir iade içinde oluşur. Bu hatanın oluşmaması için basit bir yol, bir aralık denetimi kodunuzda eklemektir. Örneğin,:
   If (x)>=65535.5
   Then Error 6
				

Etkilenen programlardan yalnızca, açıkça 6 (taşma) hata yakalama olması ve bir <a0>Tamsayı</a0> veri türü için kayan nokta ifadenin açık atama ya da bir Long veri türü içeren veya açık dönüştürme, kayan bir noktayı CInt() veya CLng() kullanarak ifade.

Açık sınırları taşması koşullarını önlemek için denetimi kullanan programlar etkilenmez.

C dil dinamik bağlantı kitaplığı (DLL) kodunu geçiş olumsuz denetimi sınırları döngü performansı etkilerse, daha iyi bir seçenek olabilir.

Program sonuçları

Derleme düzeyinde, önerilen geçici çözümü ekleme hemen FIST yönergenin önceki FRNDINT (serbest noktası yuvarlak için bir tamsayı) yönergenin ' dir. Kayan yuvarlak doğru FRNDINT olacaktır (karşıt olarak FISTP) FIST yönergenin yürütülmeden önce değer işaret; düzeltme girişinin korumak de gerekir. Visual Basic gelecek sürümleri bu düzeltme içerir.

Not:, düşük performans ve hızını sorunu işlemcinin kayan nokta yönergeleri öykünme zorlar herhangi bir yöntemini kaçının.

Yuvarlama modu hataları

Altı belirli işlenenleri FIST yönergeleri değil beklendiği gibi sonuçlarıdır. Her dört yuvarlama modda bayrağı farklar vardır. Ayrıca, "up" ve "kapalı" modları yuvarlama saklanmasını yanlış bir sayı olasılığı vardır. "En yakın" ve "sık kullanılan modları, yuvarlama chop" belleğe depolanan değeri doğru mu? Bu hata, 16-32-CVE-2006- ve 64-bit türevlerini yönergenin etkiler.

Aşağıdaki tablo, yuvarlama modları ve beklenen ve fiili değerleri etkilenen sayıları gösterir:
   Operand     | Rounding | Exp. | Actual | Exp. | Actual | Exp. | Actual
(any one of)   |  mode    | mode |  mode  |  PE  |   PE   |  C1  |   C1
-----------------------------------------------------------------------
1/16 (0.0625)  |  nearest |  0   |   0    |   1  |  unch. |  0   |   0
1/8 (0.125)    |   chop   |  0   |   0    |   1  |  unch. |  0   |   0
3/16 (0.1875)  |   down   |  0   |   0    |   1  |  unch. |  0   |   0
               |    up    |  1   |   0    |   1  |  unch. |  1   |   0
-1/16 (-0.0625)|  nearest |  0   |   0    |   1  |  unch. |  0   |   0
-1/8 (-0.125)  |   chop   |  0   |   0    |   1  |  unch. |  0   |   0
-3/16 (-0.1875)|   down   | -1   |   0    |   1  |  unch. |  1   |   0
               |    up    |  0   |   0    |   1  |  unch. |  0   |   0
				

Altı sayı (1/16, 1/8/16, 3-1/16, -1/8 ve -3/16) yanlış sonuçlar ortaya çıkabilir. Yuvarlama modları, oluşan yuvarlama ile PE bayrağı sürekli olarak ayarlanmaz; bu değişmeden kalır. Yuvarlama "yukarı" modunda üç pozitif sayılar, benzer şekilde, yuvarlama "aşağı" modunda üç negatif sayılar için hatalı bir sonuç (0 -1 yerine) FIST verir; FIST hatalı bir değer (0, 1) depolar. Her iki durumda, C1 kill bitini de doğru ayarlanmamıştır. C1 bit olarak ancak "en yakın" ve "modları yuvarlama chop", bellek için saklanan değer her zaman doğru olur.

Program sonuçları

Yuvarlama modu "yukarı"veya "aşağı." zaman hatalı sonuçlar ikinci hata yalnızca döndürdü Bu nedenle, uygulama yuvarlama modu dil varsayılan açıkça değiştirir sürece uygulama etkilememelidir. Bir uygulama değişiklikleri "yukarı" veya "kapalı" modu yuvarlama, dil tarafından sağlanan floating-point-değeri-için--tamsayı dönüştürme özellikleri artık güvenir ve örneğin FRNDINT kullanarak, kendi sağlamanız gerekir.

Tüm etkileyen PE bayrak durumu yanlış bilgiler modları yuvarlama, çoğu uygulamada anlamsız olmalıdır. Yuvarlama, PE bayrağı zaten ayarlanmış. Tipik olarak da maskelenmiş PE özel durum. Hatalı değerler anlamsız şekilde C1 kill bitini, yalnızca bir özel durum işleyicisi tarafından kullanılır.

Geçici Çözüm

Ikinci FIST hata için önerilen geçici çözümü derleme düzeyinde ilk aynıdır; hemen FIST yönergenin önceki FRNDINT yönergenin ekleme.

Uygulama programcıları ikinci hata hatalar modları yuvarlama varsayılan geçersiz yuvarlama kurtulabilirsiniz.

Not: işlemcinin kayan nokta yönergeleri öykünme zorlar herhangi bir yöntemi, her iki sorunları, düşük performans ve hızı kaçının.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
Anahtar Kelimeler: 
kbmt KB126455 KbMttr
Otomatik TercümeOtomatik Tercüme
Ö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:126455  (http://support.microsoft.com/kb/126455/en-us/ )
Retired KB ArticleKullanı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.