Perbezaan Antara Float Dan Double - Mana Yang Harus Saya Gunakan? Perbezaan Antara

Anonim

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

Ramai pengaturcara / pelajar baru yang mendaftar dalam Sains Komputer bertanya soalan yang sering ditanya 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 , octal dan heksadesek < sistem. Ini adalah format nombor komputer yang merupakan representasi dalaman bagi nilai angka dalam komputer (atau kalkulator dan mana-mana jenis komputer digital lain). Nilai-nilai ini disimpan sebagai "pengumpulan 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), masuk akal untuk mengajar tentang format nombor yang berbeza yang digunakan untuk mewakili pelbagai nilai dinamik, kerana mereka membentuk blok dasar pengiraan / pemprosesan angka dalam sebarang jenis operasi. Sebaik sahaja sistem nombor ditakrifkan di dalam bilik darjah (seringkali tidak baik), pelajar digoda untuk bergerak ke format nombor yang berlainan dalam jenis yang sama (i. E., 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 Float dan Double , dan sementara mereka menargetkan keperluan yang sama (iaitu aritmetik floating-point ), beberapa perbezaan dalam perwakilan dalaman mereka dan kesan keseluruhan pada pengiraan dalam program. Adalah malang bahawa ramai pengaturcara terlepas perbezaan antara jenis data Flat dan Double, dan akhirnya menyalahgunakannya di tempat yang tidak sepatutnya 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 urusannya?

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 , dll.), pecahan dalam perduaan. Sebagai nombor perpuluhan yang dihasilkan (i., 20. 123 , 16. 23 , dsb.) tidak dapat dengan mudah diwakili dengan format perduaan biasa (i., Integer). Perbezaan utama antara Float dan Double ialah data terapung tunggal (32-bit) yang bersifat ketepatan tunggal, sementara yang kedua adalah jenis data floating point ketepatan ganda (64-bit). Double dipanggil "double" kerana ia pada dasarnya adalah versi ketepatan double Float. Sekiranya anda mengira sejumlah besar (fikirkan beribu-ribu 0 dalam nombor), maka ketidaktepatan akan menjadi lebih kecil dalam Double dan anda tidak akan kehilangan ketepatan yang tinggi.

Adalah lebih baik untuk menghuraikan menggunakan contoh kod. Berikut ialah operasi di Float dan 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.

Semuanya, lebih baik menggunakan Double untuk aritmetik terapung, kerana beberapa fungsi matematik standard dalam C beroperasi pada komputer Double dan moden sangat pantas dan cekap untuk pengiraan Double floating-point. Ini membawa kepada mengurangkan keperluan menggunakan Float, melainkan jika anda perlu mengendalikan banyak nombor terapung (fikirkan array besar dengan beribu-ribu 0 dalam angka) atau anda beroperasi pada sistem yang tidak menyokong sistem 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 harus 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.

Terdapat jarang sebab untuk menggunakan Float dan bukan Double dalam kod yang menyasarkan komputer moden. Ketepatan tambahan dalam Double mengurangkan, tetapi tidak menghapuskan, kemungkinan kesalahan pembundaran 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 Floating-point, saya sangat mengesyorkan anda membaca artikel yang hebat ini (// docs. Oracle com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Ringkasan

Jadi … secara ringkas:

Tempat di mana anda harus menggunakan Float:

Jika anda menyasarkan perkakasan di mana ketepatan tunggal lebih cepat daripada ketepatan dua.

  • Aplikasi anda menggunakan penggunaan aritmetik terapung terapung, seperti beribu-ribu nombor dengan beribu-ribu 0.
  • Anda melakukan pengoptimuman peringkat rendah. Contohnya, anda menggunakan arahan CPU khas (i., SSE, SSE2, AVX, dan lain-lain) yang beroperasi pada banyak nombor / tatasusunan / vektor pada satu masa.
Kesimpulan

Dalam artikel ini saya telah menonjolkan 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 menargetkan komputer moden, kerana kemungkinan kecekapan rendah kerana penggunaan aritmetik terapung dua kali sangat tidak mungkin. Jika anda mempunyai sebarang pertanyaan, maka anda boleh bertanya di bahagian komen di bawah!