Operasi dengan tipe double di C

pemrograman


tolong jelaskan cara kerjanya? Program ini memberi saya hasil yang benar hanya ketika saya menambahkan bilangan bulat, tetapi dalam tugas saya, saya lebih suka menggunakan tipe double.

opsi kerja:
`

C++
for (int i = -10000; i < 10000; i++) {
    formula = s1 / (v1 + k) + s2;
    if (formula == 0) {
        break;
}
    k += 1;
}

Hasil:3.000000
`

itu tidak berfungsi dengan benar:
`

C++
for (int i = -10000; i < 10000; i++) {
    formula = s1 / (v1 + k) + s2;
    if (formula == 0) {
        break;
}
    k += 0.00001;
}

Hasil:0,200000
`

Apa yang saya coba:

dalam program saya, saya membutuhkan hasil yang lebih presisi sehingga saya tidak bisa menggunakan tipe int.

Solusi 1

Langkah pertama adalah memastikan variabelnya formula, s1, s2, v1Dan k semuanya bertipe ganda. Anda sebenarnya tidak perlu semuanya menjadi ganda tetapi Anda ingin memastikan hasilnya (formula) adalah ganda dan pembagian harus dilakukan dengan ganda. Hasil bilangan bulat hampir pasti akan memberikan hasil yang salah.

Langkah kedua adalah berhati-hati terhadap perbandingan yang sama dengan nilai ganda, yaitu menguji if formula adalah nol. Teknik yang biasa dilakukan adalah dengan menentukan nilai epsilon yang berarti “cukup dekat” dan membandingkannya dengan itu. Berikut ini contohnya:

C++
const double epsilon = 1.0E-9;

// do calculations here

double delta = fabs( formula );
if( delta < epsilon )
    break;

Ini akan keluar dari loop for if formula berada di kisaran antara -1E-9 dan +1E-9. Anda dapat menggunakan 1.0E-6 atau nilai lain untuk epsilon asalkan masih dalam toleransi komputasi yang Anda inginkan.

Solusi 2

Ada beberapa hal yang perlu diperhatikan di sini. Tampaknya hanya variabel k yang diubah pada setiap loop.

C
for (int i = -10000; i < 10000; i++) {
  formula = s1 / (v1 + k) + s2;
  if (formula == 0) {
	break;
  }
  k += 0.00001;
}

Sayangnya, nilai k += 0,00001 tidak dapat disimpan persis sebagai float (atau double), sehingga compiler biasanya menggunakan nilai terdekat. Jika sekarang Anda menjumlahkan angka-angka ganda yang tidak sama persis ini, kesalahan dalam penjumlahan meningkat pada setiap putaran.

Saat ini ada beberapa cara untuk mengatasi masalah tersebut.
1. daripada terus-menerus menambahkan lagi, lebih baik mengalikan satu kali dengan indeks irisan, yang akan meningkatkan akurasi secara signifikan.
2. daripada membandingkan dua pelampung secara langsung satu sama lain, akan lebih baik untuk memeriksa perbedaannya, dimana perbedaannya sering kali tidak menjadi 0, tetapi harus berada di bawah nilai yang ditentukan.

Menggunakan double daripada float untuk akurasi yang lebih baik hanya akan mengalihkan masalah, bukan menyelesaikannya.

コメント

タイトルとURLをコピーしました