Aracılığıyla paylaş


Kayan noktalı sayıların duyarlığı neden kaybedebilirsiniz

Kayan noktalı ondalık değerler tam bir ikili gösterim genellikle gerekmez. Yan etkisi cpu kayan nokta veri sunuş şekli budur. Bu nedenle, duyarlılık kaybı yaşayabilirsiniz ve bazı kayan nokta işlemleri beklenmeyen sonuçlara neden olabilir.

Bu davranış aşağıdakilerden birini bir sonucudur:

  • Ondalık sayı ikili gösterimi tam olmayabilir.

  • Kullanılan numaralar arasında (örneğin, karıştırma float ve double) bir tür uyuşmazlığı var.

Bu davranışı gidermek için çoğu programcı ya da değer büyüktür veya miktardan daha az gerekli emin olun veya alın ve duyarlılık korur bir ikili kodlanmış ondalık (bcd) Kitaplığı'nı kullanın.

Kayan nokta deðerlerinin ikili gösterimini kesinlik ve kayan noktalı hesaplamalar doğruluğunu etkiler. Microsoft Visual C++ kullanan IEEE kayan nokta biçimi.

Örnek

// Floating-point_number_precision.c
// Compile options needed: none. Value of c is printed with a decimal 
// point precision of 10 and 6 (printf rounded value by default) to 
// show the difference
#include <stdio.h>

#define EPSILON 0.0001   // Define your own tolerance
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))

int main() {
   float a, b, c;

   a = 1.345f;
   b = 1.123f;
   c = a + b;
   // if (FLOAT_EQ(c, 2.468)) // Remove comment for correct result
   if (c == 2.468)            // Comment this line for correct result
      printf_s("They are equal.\n");
   else
      printf_s("They are not equal! The value of c is %13.10f "
                "or %f",c,c);
}
      

Comments

EPSILON için float 1.192092896e olarak tanımlanan FLT_EPSILON sabitleri kullanabilirsiniz-07F, veya 2.2204460492503131e olarak tanımlanan DBL_EPSILON-016. Bu sabitlerin float.h eklemeniz gerekir. Bu sabitlerin x, örneğin en küçük pozitif sayı olarak tanımlanır, x + 1.0 1.0 eşit değil. Bu çok küçük bir sayı olduğu için çok büyük sayılar ilgili hesaplamalar için kullanıcı tanımlı hata payı içermelidir.

Ayrıca bkz.

Kavramlar

Kodunuzu en iyi duruma getirme