Perbezaan antara terapung dan berganda - mana yang harus saya gunakan?

Perbezaan antara terapung dan berganda - mana yang harus saya gunakan?

(Nota: Artikel ini mengandaikan bahawa pembaca tahu mengenai asas -asas sains komputer)

Ramai pengatur / pelajar baru yang mendaftar dalam sains komputer bertanya soalan yang sering 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 Hexadecimal sistem. Ini adalah format nombor komputer yang merupakan representasi dalaman nilai angka dalam komputer (atau kalkulator dan komputer digital lain). Nilai -nilai ini disimpan sebagai "pengelompokan bit".

Seperti yang kita tahu komputer mewakili data dalam set digit binari (i.e., 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 asas pengiraan/pemprosesan nombor dalam apa -apa jenis operasi. Sebaik sahaja sistem nombor ditakrifkan di dalam bilik darjah (selalunya kurang), pelajar tergoda untuk bergerak ke format nombor yang berbeza dalam jenis yang sama (i.e., aritmetik terapung) yang mempunyai jarak ketepatan dan nombor tertentu. Oleh itu, mereka terpaksa mempelajari nuansa antara jenis tertentu. Dua jenis data yang paling biasa digunakan adalah Terapung dan Ganda, Dan sementara mereka menargetkan keperluan yang sama (i.e., aritmetik terapung), terdapat sedikit perbezaan dalam perwakilan dalaman mereka dan kesan keseluruhan pada pengiraan dalam program. Adalah malang bahawa banyak pengaturcara merindui nuansa antara jenis data rata dan berganda, dan akhirnya menyalahgunakannya di tempat di mana mereka tidak boleh 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 perjanjiannya?

Float dan Double adalah perwakilan data yang digunakan untuk operasi aritmetik terapung, memikirkan nombor perpuluhan yang anda hitung dalam kelas matematik, seperti, 20.123, 16.23, 10.2, dan lain-lain., mereka bukan nombor keseluruhan (i.e., 2, 5, 15, dan lain-lain.), oleh itu mereka memerlukan pertimbangan pecahan dalam binari. Sebagai nombor perpuluhan yang dihasilkan (i.e., 20.123, 16.23, dan lain-lain.) tidak dapat diwakili dengan mudah dengan format binari biasa (i.e., Integer). Perbezaan utama antara terapung dan dua adalah bahawa bekas adalah data titik terapung ketepatan (32-bit) tunggal, manakala yang terakhir adalah ketepatan dua (64-bit) jenis data terapung. Double dipanggil "double" kerana ia pada dasarnya merupakan versi ketepatan berganda Float. Sekiranya anda mengira jumlah yang besar (fikirkan beribu -ribu 0 dalam nombor), maka ketidaktepatan akan lebih kecil dalam dua kali ganda dan anda tidak akan kehilangan banyak ketepatan.

Lebih baik menghuraikan menggunakan contoh kod. Berikut adalah operasi pada terapung dan berganda melalui fungsi matematik yang disediakan dalam bahasa C:

#include

int main ()

terapung num1 = 1.f / 82;

float num2 = 0;

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

num2 += num1;

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

dua num3 = 1.0/82;

Double num4 = 0;

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

num4 += num3;

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

getchar ();

Ia mencetak yang berikut:

9.000031

8.999999999999983

Di sini, anda dapat melihat bahawa sedikit perbezaan dalam ketepatan float dan dua kali memberikan jawapan yang berbeza sama sekali, walaupun berganda kelihatan lebih tepat daripada terapung.

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 dalam double mempunyai ketepatan yang lebih baik.

Semua dalam semua, lebih baik menggunakan dua kali ganda untuk aritmetik terapung, kerana beberapa fungsi matematik standard dalam C beroperasi pada komputer berganda dan moden sangat cepat dan cekap untuk pengiraan dua terapung dua kali. Ini membawa kepada mengurangkan keperluan untuk menggunakan apungan, melainkan jika anda perlu beroperasi pada banyak nombor terapung (memikirkan array besar dengan beribu-ribu 0 dalam nombor) atau anda beroperasi pada sistem yang tidak menyokong dua Titik Terapung Precision, seperti banyak GPU, peranti berkuasa rendah dan platform tertentu (ARM Cortex-M2, Cortex-M4, dan lain-lain.) belum menyokong dua kali, maka anda harus menggunakan apungan. Di samping itu, satu perkara yang perlu diingat ialah bahawa GPU / CPU tertentu berfungsi lebih baik / cekap dalam pemprosesan apungan, seperti dalam pengiraan vektor / matriks, jadi anda mungkin perlu melihat dalam manual / dokumentasi spesifikasi perkakasan untuk menentukan yang lebih baik untuk mesin tertentu.

Jarang ada alasan untuk menggunakan terapung dan bukannya dua kali ganda dalam kod yang mensasarkan komputer moden. Ketepatan tambahan dalam mengurangkan dua kali, tetapi tidak menghapuskan, kemungkinan kesilapan pembulatan atau ketepatan lain yang boleh menyebabkan masalah di bahagian lain program. Banyak fungsi matematik atau pengendali menukar dan kembali dua kali ganda, jadi anda tidak perlu membuang nombor kembali ke terapung, kerana itu mungkin kehilangan ketepatannya. Untuk analisis terperinci mengenai aritmetik terapung, saya sangat mengesyorkan anda membaca artikel hebat ini (http: // docs.Oracle.com/cd/e19957-01/806-3568/ncg_goldberg.html).

Ringkasan

Jadi ... secara ringkas:

Tempat di mana anda harus menggunakan apungan:

  • Sekiranya anda menyasarkan perkakasan di mana ketepatan tunggal lebih cepat daripada ketepatan dua.
  • Permohonan anda menggunakan berat aritmetik terapung, seperti beribu-ribu nombor dengan beribu-ribu 0.
  • Anda melakukan pengoptimuman peringkat rendah. Contohnya, anda menggunakan arahan CPU khas (i.e., SSE, SSE2, AVX, dll.) yang beroperasi pada pelbagai nombor / array / vektor pada satu masa.

Kesimpulan

Dalam artikel ini saya telah menyerlahkan perbezaan antara apungan dan dua kali ganda, dan yang mana yang harus digunakan di tempat tertentu. Boleh dikatakan, lebih baik menggunakan dua kali di kebanyakan tempat secara membabi buta, terutamanya jika anda menargetkan komputer moden, kerana peluang kecekapan rendah kerana penggunaan aritmetik terapung dua kali tidak mungkin. Sekiranya anda mempunyai sebarang pertanyaan, maka anda boleh bertanya di bahagian komen di bawah!