Perbezaan Antara Terapung Dan Ganda - Mana Yang Harus Saya Gunakan?

(Nota: Artikel ini menganggap bahawa pembaca tahu mengenai asas-asas Sains Komputer)

Ramai pengaturcara / pelajar baru yang mendaftar dalam Sains Komputer bertanya soalan yang kerap ditanya yang berkaitan dengan bidang tertentu dalam Sains Komputer yang mereka pelajari. Kebanyakan kursus pemula bermula dengan topik sistem nombor yang digunakan dalam komputer moden, termasuk binari, perpuluhan, oktal dan heksadesimal sistem. Ini adalah format nombor komputer yang merupakan perwakilan dalaman nilai angka dalam komputer (atau kalkulator dan mana-mana jenis komputer digital lain). Nilai-nilai ini disimpan sebagai "kumpulan bit".

Seperti yang kita tahu komputer mewakili data dalam set angka binari (iaitu, dalam gabungan 1s dan 0s, seperti, 1111 mewakili 15 dalam sistem perpuluhan), adalah masuk akal untuk mengajar tentang format nombor yang berbeza yang digunakan untuk mewakili pelbagai nilai dinamik, kerana mereka membentuk blok asas pengiraan / pemprosesan angka dalam sebarang jenis operasi. Sebaik sahaja sistem nombor ditakrifkan di dalam bilik darjah (sering kurang), pelajar digoda untuk bergerak ke format nombor yang berbeza dalam jenis yang sama (iaitu., aritmetik terapung terapung) yang mempunyai ketepatan tertentu dan julat nombor. Oleh itu, mereka terpaksa belajar nuansa antara jenis tertentu. Dua jenis data yang paling biasa digunakan ialah Terapung dan Double, dan sementara mereka menargetkan keperluan yang sama (iaitu., aritmetik terapung terapung), terdapat sedikit perbezaan dalam perwakilan dalaman mereka dan kesan keseluruhan terhadap pengiraan dalam program. Adalah malang bahawa banyak pengaturcara melepaskan nuansa antara jenis data Flat dan Double, dan akhirnya menyalahgunakannya di tempat yang tidak seharusnya digunakan di tempat pertama. Akhirnya mengakibatkan salah perhitungan di bahagian lain program.

Dalam artikel ini, saya akan memberitahu anda perbezaan antara terapung dan berganda dengan contoh kod dalam bahasa pengaturcaraan C. Mari kita mulakan!

Float vs Double ... Apa kesepakatan itu?

Float and Double adalah representasi data yang digunakan untuk operasi aritmetik floating-point, fikirkan nombor perpuluhan yang anda hitung dalam kelas matematik, seperti, 20.123, 16.23, 10.2, dan lain-lain, mereka bukan nombor keseluruhan (iaitu., 2, 5, 15, dan sebagainya), oleh itu mereka memerlukan balasan pecahan dalam binari. Sebagai nombor perpuluhan yang dihasilkan (iaitu., 20.123, 16.23, dll.) tidak dapat dengan mudah diwakili dengan format perduaan normal (iaitu, Integer). Perbezaan utama antara Float and Double ialah data terapung tunggal (32-bit) yang bersifat ketepatan tunggal, manakala yang kedua adalah jenis data floating point precision (64-bit). Double dipanggil "double" kerana pada dasarnya adalah versi ketepatan ganda Float. Sekiranya anda mengira sejumlah besar (fikirkan beribu-ribu 0 dalam nombor), maka ketidaktepatan akan menjadi lebih kecil di Double dan anda tidak akan kehilangan ketepatan yang banyak.

Adalah lebih baik untuk menghuraikan menggunakan contoh kod. Berikut adalah operasi di Float and Double melalui fungsi matematik yang disediakan dalam bahasa C:

#include

int main ()

float num1 = 1.f / 82;

float num2 = 0;

untuk (int i = 0; i < 738; ++i)

num2 + = num1;

printf ("% .7g \ n", num2);

double num3 = 1.0 / 82;

double num4 = 0;

untuk (int i = 0; i < 738; ++i)

num4 + = num3;

printf ("% 15g \ n", num4);

getchar ();

Ia mencetak perkara berikut:

9.000031

8.99999999999983

Di sini, anda dapat melihat bahawa perbezaan kecil dalam ketepatan Float and Double memberikan jawapan yang sama sama sekali, walaupun Double kelihatan lebih tepat daripada Float.

Berikut adalah contoh fungsi sqrt () dalam C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", num1);

printf ("% f \ n", num2);

getchar ();

Ia memberikan output berikut:

48813108.000000

48813109.678778

Di sini, anda dapat melihat bahawa jawapan di Double mempunyai ketepatan yang lebih baik.

Secara keseluruhannya, lebih baik menggunakan Double untuk aritmetik terapung, kerana beberapa fungsi matematik standard dalam C beroperasi pada komputer Double dan moden adalah sangat cepat dan cekap untuk pengiraan terapung Double. Ini akan mengurangkan keperluan untuk menggunakan Float, melainkan jika anda perlu mengendalikan banyak nombor floating-point (memikirkan array besar dengan beribu-ribu 0 dalam nombor) atau anda beroperasi pada sistem yang tidak menyokong double- ketepatan titik terapung, kerana banyak GPU, peranti berkuasa rendah dan platform tertentu (ARM Cortex-M2, Cortex-M4, dll) tidak menyokong Double lagi, maka anda harus menggunakan Float. Di samping itu, satu perkara yang perlu diingati ialah GPU / CPU tertentu berfungsi lebih baik / cekap dalam pemprosesan Float, seperti dalam pengiraan vektor / matriks, jadi anda mungkin perlu melihat manual / dokumentasi spesifikasi perkakasan untuk menentukan yang mana yang patut anda gunakan untuk mesin tertentu.

Tidak ada sebab untuk menggunakan Float dan bukan Double dalam kod yang menyasarkan komputer moden. Ketepatan tambahan dalam Double reduces, tetapi tidak menghilangkan, kemungkinan kesalahan pembulatan atau ketepatan lain yang dapat menyebabkan masalah di bahagian lain program. Banyak fungsi atau pengendali matematik menukar dan kembali Double, jadi anda tidak perlu menghantar nombor kembali ke Float, kerana itu mungkin kehilangan ketepatan. Untuk analisis terperinci mengenai aritmetik Terapung, saya sangat mengesyorkan anda membaca artikel yang hebat ini (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Ringkasan

Jadi ... secara ringkas:

Tempat di mana anda perlu menggunakan Float:

  • Jika anda menargetkan perkakasan di mana ketepatan tunggal lebih cepat daripada ketepatan dua.
  • Aplikasi anda membuat penggunaan aritmetik terapung terapung, seperti beribu-ribu nombor dengan beribu-ribu 0.
  • Anda sedang melakukan pengoptimuman peringkat rendah. Sebagai contoh, anda menggunakan arahan CPU khas (iaitu, SSE, SSE2, AVX, dan lain-lain) yang beroperasi pada banyak nombor / tatasusunan / vektor pada satu masa.

Kesimpulannya

Dalam artikel ini saya telah menyerlahkan perbezaan antara Float dan Double, dan mana yang harus digunakan di tempat tertentu. Boleh dikatakan, lebih baik menggunakan Double di kebanyakan tempat secara membuta tuli, terutamanya jika anda menyasarkan komputer moden, kerana kemungkinan kecekapan rendah kerana penggunaan aritmetik terapung Double adalah sangat tidak mungkin. Jika anda mempunyai sebarang pertanyaan, maka anda boleh bertanya di bahagian komen di bawah!