Apa perbedaan antara variabel ganda dan float dalam pemrograman C?


Jawaban 1:

'Float' adalah angka 32 bit - diformat untuk memungkinkan kompromi antara ukuran maksimum dan minimum dari angka tersebut dan ketepatan yang diwakilinya.

‘Ganda’ adalah (biasanya) angka 64 bit - ia memiliki ketepatan yang lebih tinggi dan rentang angka yang lebih besar daripada ‘float’ - tetapi membutuhkan ruang penyimpanan dua kali lebih banyak.

Beberapa kompiler mendukung "long double" yang bisa berupa 80 atau 128 bit ... tapi ini SANGAT jarang digunakan atau dibutuhkan.

Dahulu kasus 'aritmatika' ganda 'jauh lebih lambat daripada' float '- tetapi pada PC dan laptop modern (mungkin bahkan ponsel) - perbedaannya terlalu kecil untuk dipedulikan - atau sepenuhnya hilang.

Tetapi pada prosesor kecil seperti yang ada di oven microwave Anda - matematika presisi ganda HORRIBLY lambat ... dan bahkan presisi mengambang mungkin berlebihan.

Merupakan praktik yang baik untuk menggunakan ketepatan 'float' di mana pun Anda bisa - dan tidak menggunakan 'double' kecuali itu benar-benar penting ... yang sebenarnya sangat jarang.

Namun, dalam beberapa kasus - Anda perlu dobel.

Jadi - misalnya - saya membuat perangkat lunak simulator penerbangan. 'Pelampung' memiliki presisi sekitar satu bagian dalam 16 juta ... yang terdengar cukup bagus. Tetapi jika saya ingin menggunakan sistem koordinat X, Y, Z dengan asal di pusat bumi (yang tampaknya agak alami) ... maka setiap titik di permukaan sekitar 6.300 kilometer dari asal ... yaitu 6,3 meter. Jadi dalam sistem saya, kesalahan satu bagian dalam 16 juta adalah sekitar 40 sentimeter ... dan ketika Anda mendaratkan pesawat di landasan pacu dan komputer memilikinya 40 sentimeter di bawah landasan bukan langsung di atasnya ... hal-hal yang sangat buruk terjadi !

Karenanya, saya harus menggunakan presisi "ganda" dan bukan "mengambang".

Jika Anda menulis program untuk menyeimbangkan buku cek Anda - maka satu bagian dalam 16 juta tidak masalah. Seorang jutawan mungkin dapat mengatasi beberapa sen kesalahan ... dan rata-rata orang tidak akan melihat masalah.


Jawaban 2:

Ada beberapa jawaban di sini - tetapi saya akan menjawab dari perspektif praktis. Ini adalah komentar di jawaban lain, tapi saya pikir poin saya cukup penting untuk menjadikannya jawaban yang terpisah.

Angka floating point dalam C (atau bahasa komputasi lainnya - termasuk PHP, Python, Excel, dll.) Adalah solusi mudah untuk nilai fraksional yang sering menempatkan aplikasi (program) dan pengguna dalam risiko karena risiko inheren ketidaktepatan, terutama ketika digunakan tanpa pemahaman yang tepat tentang cara mengurangi risiko.

C sendiri TIDAK MENENTUKAN ukuran atau keakuratan "float" atau "double". Versi modern C (C11 dan yang lebih baru) menetapkan cara menunjukkan kisaran apa yang digunakan untuk kompiler dan CPU target. Anda dapat memahami keakuratannya - tetapi Anda tidak memiliki jaminan minimal kecuali untuk kompiler dan implementasi C spesifik tersebut.

Implementasi aktual dari "float", et. biasanya tergantung pada kompiler dan CPU. Sejak 1985, ada standar dari IEEE tentang ini, tetapi standar itu dimaksudkan untuk bertukar data daripada memprosesnya.

Format titik mengambang (float, double, long double) memiliki 3 bagian - tanda, eksponen, dan mantissa. Tandanya adalah satu bit. Eksponen dan mantissa diwakili dalam biner. Dalam format modern (dipengaruhi IEEE), ada '1' implisit di awal bit mantissa. Nilai-nilai tertentu dicadangkan untuk “Bukan Angka / NaN”, 0,0, dll.

Karena sifat biner dari mantissa, satu-satunya fraksi yang dapat diwakili dengan sempurna adalah yang terbagi hanya oleh 2.

"Float" (dalam C) sering disimpan dalam 32 bit - yang 9 bit biasanya untuk eksponen dan tanda. Yang tersisa hanya 23 bit (+1 - karena ada '1' tersirat di awal) - atau kurang dari 8 digit akurasi. (8 digit hampir tidak cukup untuk harga nilai rumah starter tunggal.)

"Ganda" biasanya memperpanjang mantissa dari 24 bit menjadi 56 bit - atau kurang dari 18 digit akurasi. Itu mungkin cukup untuk melakukan pajak Anda satu tahun, tetapi tidak menjalankan bisnis.

Tetapi dengan perhitungan SETIAP dilakukan dengan angka floating point, Anda kehilangan presisi. Dengan jumlah bit yang tidak mencukupi, kehilangan presisi bisa menjadi ekstrem.

Juga, format "printf ()" tidak termasuk ‘float’ - cukup gandakan, jadi Anda perlu mempromosikan float menjadi ganda untuk mencetaknya.

Di bawah ini adalah program C yang menunjukkan betapa halusnya masalah - dan memberi Anda pemula untuk menjelajahi masalah ini. Setelah itu, apakah output menunjukkan masalah.

/ *
 * Program 'C' untuk menunjukkan batas mengapung
 *
 * /

#include 
#sertakan 
#include  / * untuk strerror () * /
#termasuk 



/ * Deklarasi - 'utama' dinyatakan secara implisit. * /

demo batal statis (char * digit);
static void show (nomor panjang, daftar float *);




/ * Definisi * /

kekosongan statis
tampilkan (nomor panjang, daftar float *)
{
    ekspektasi float = 1.0;
    total float = 0,0;
    float diff;
    d_total ganda;
    d_diff ganda;

    if ((angka <= 0) || (daftar == (float *) NULL))
    {
kembali;
    }

    printf ("1.0f /% ld =>% 15.9e \ n", angka, (1.0 / angka));

    / * Pertama, inisialisasi 'daftar' * /
    untuk (unsigned int i = 0; i <= number; i ++)
    {
list [i] = (1.0f * i) / number; / * Ekspresi float memaksa hasil float * /

    }


    / * Sekarang, bandingkan pasangan. * /
    untuk (unsigned int i = 0; i <= number; i ++)
    {
int pick = number - i;
float low = daftar [i];
float hi = daftar [pilih];
jumlah mengambang;
d_sum ganda;


jika (pilih 

Dan hasilnya:

% ./float 11
 1.0f / 11 => 9.090909091e-02
Untuk 0 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 1 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 2 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 3 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 4 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 5 dari 11, jumlah adalah 1,0000000e + 00, beda (dari 1,0) adalah 0,0000000e + 00
Untuk 11, totalnya adalah 1.000000119e + 00, beda (dari 1.0) adalah -1.192092896e-07

Jawaban 3:

Ada tiga tipe floating-point nyata dalam C: float, double, dan long double. Standar (C99 dan C11) menyatakan bahwa “Himpunan nilai dari tipe float adalah himpunan bagian dari himpunan nilai dari tipe ganda; himpunan nilai dari tipe ganda adalah himpunan bagian dari nilai-nilai dari tipe long double. "

Secara umum, semakin banyak bit yang digunakan untuk menyimpan nilai floating-point, semakin presisi dan rentang nilai yang lebih luas yang dapat Anda simpan. Jumlah aktual bit yang ditempati oleh masing-masing tipe data ini tidak ditentukan dalam standar, jadi Anda harus memeriksa dokumentasi kompiler spesifik Anda, atau menggunakan sizeof operator untuk mengetahui berapa banyak byte yang ditempati setiap tipe data. Misalnya, dalam kompiler C Microsoft saat ini, float adalah 4 byte (32 bit), dobel 8 byte (64 bit), dan dobel panjang juga 8 byte (64 bit). Dalam lingkungan khusus ini, ganda secara efektif sama dengan ganda panjang, tapi itu tidak terjadi di semua lingkungan kompiler. Agar portabel, kode Anda tidak boleh membuat asumsi tentang ukuran tipe data.

Konstanta #define yang disediakan dalam file header float.h memungkinkan Anda melihat berbagai karakteristik tipe data ini untuk implementasi kompiler khusus Anda. Misalnya, FTL_MIN dan FLT_MAX memberikan nilai float minimum dan maksimum, DBL_MIN dan DBL_MAX memberikan min dan max untuk nilai ganda, dan LDBL_MIN dan LDBL_MAX menyediakan min dan max untuk double panjang. Sekali lagi, rentang ini akan bervariasi di antara lingkungan penyusun.