Share via


Mengapa Angka Titik-Mengambang Dapat Kehilangan Presisi

Nilai desimal titik mengambang umumnya tidak memiliki representasi biner yang tepat. Ini adalah efek samping dari bagaimana CPU mewakili data floating point. Untuk alasan ini, Anda mungkin mengalami beberapa kehilangan presisi, dan beberapa operasi floating-point dapat menghasilkan hasil yang tidak terduga.

Perilaku ini adalah hasil dari salah satu hal berikut:

  • Representasi biner dari angka desimal mungkin tidak tepat.

  • Ada ketidakcocokan jenis antara angka yang digunakan (misalnya, mengambang pencampuran dan ganda).

Untuk mengatasi perilaku, sebagian besar programmer memastikan bahwa nilainya lebih besar atau kurang dari apa yang diperlukan, atau mereka mendapatkan dan menggunakan pustaka Desimal Kode Biner (BCD) yang akan mempertahankan presisi.

Representasi biner dari nilai floating-point memengaruhi presisi dan akurasi perhitungan floating-point. Microsoft Visual C++ menggunakan format titik mengambang IEEE.

Contoh

// 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);
}
They are not equal! The value of c is  2.4679999352 or 2.468000

Komentar

Untuk EPSILON, Anda dapat menggunakan konstanta FLT_EPSILON, yang didefinisikan untuk float sebagai 1,192092896e-07F, atau DBL_EPSILON, yang didefinisikan untuk ganda sebagai 2.2204460492503131e-016. Anda perlu menyertakan float.h untuk konstanta ini. Konstanta ini didefinisikan sebagai angka positif terkecil x, sehingga x+1.0 tidak sama dengan 1.0. Karena ini adalah jumlah yang sangat kecil, Anda harus menggunakan toleransi yang ditentukan pengguna untuk perhitungan yang melibatkan jumlah yang sangat besar.

Baca juga

Mengoptimalkan Kode Anda