Saya sedang membuat bilah kemajuan ketika saya perhatikan ini, Sesuatu yang aneh terjadi ketika menambah dua kali lipat untuk loop.

EDIT : Saya tidak bertanya mengapa floating point rusak !! Masalah saya adalah bahwa loop for mengulangi satu kali tambahan dalam kasus 1 dan satu kali lebih sedikit dalam kasus 4 !

Saya telah membuat 4 kasus uji. Silakan Lihat kode di bawah ini: -

#include <iostream>

using namespace std;
 
int main()
{
    cout << endl << "Should End on 0.9 :-" << endl; // Abnormal
    for (double i = 0 ; i < 1 ; i += 0.1) cout << i << endl;
    
    cout << endl << "Should End on 1 :-" << endl;
    for (double i = 0 ; i <= 1 ; i += 0.1) cout << i << endl;
    
    cout << endl << "Should End on 0.99 :-" << endl;
    for (double i = 0 ; i < 1 ; i += 0.01) cout << i << endl;
    
    cout << endl << "Should End on 1 :-" << endl;   // Abnormal
    for (double i = 0 ; i <= 1 ; i += 0.01) cout << i << endl;
}

Keluaran :-

Should End on 0.9 :-
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

Should End on 1 :-
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

Should End on 0.99 :-
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
0.11
0.12
0.13
0.14
0.15
0.16
0.17
0.18
0.19
0.2
0.21
0.22
0.23
0.24
0.25
0.26
0.27
0.28
0.29
0.3
0.31
0.32
0.33
0.34
0.35
0.36
0.37
0.38
0.39
0.4
0.41
0.42
0.43
0.44
0.45
0.46
0.47
0.48
0.49
0.5
0.51
0.52
0.53
0.54
0.55
0.56
0.57
0.58
0.59
0.6
0.61
0.62
0.63
0.64
0.65
0.66
0.67
0.68
0.69
0.7
0.71
0.72
0.73
0.74
0.75
0.76
0.77
0.78
0.79
0.8
0.81
0.82
0.83
0.84
0.85
0.86
0.87
0.88
0.89
0.9
0.91
0.92
0.93
0.94
0.95
0.96
0.97
0.98
0.99

Should End on 1 :-
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
0.11
0.12
0.13
0.14
0.15
0.16
0.17
0.18
0.19
0.2
0.21
0.22
0.23
0.24
0.25
0.26
0.27
0.28
0.29
0.3
0.31
0.32
0.33
0.34
0.35
0.36
0.37
0.38
0.39
0.4
0.41
0.42
0.43
0.44
0.45
0.46
0.47
0.48
0.49
0.5
0.51
0.52
0.53
0.54
0.55
0.56
0.57
0.58
0.59
0.6
0.61
0.62
0.63
0.64
0.65
0.66
0.67
0.68
0.69
0.7
0.71
0.72
0.73
0.74
0.75
0.76
0.77
0.78
0.79
0.8
0.81
0.82
0.83
0.84
0.85
0.86
0.87
0.88
0.89
0.9
0.91
0.92
0.93
0.94
0.95
0.96
0.97
0.98
0.99

[Program finished]

Kasus pertama harus berakhir pada 0.9 tetapi berakhir pada 1

Dan kasus ke-4 harus berakhir pada 1 tetapi berakhir pada 0.99

Casing ke-2 dan ke-3 berfungsi normal.

Ada ide apa yang terjadi di sini? Apa yang saya lakukan salah?

Saya menggunakan kompiler Clang pada cpu aarch64.

-1
Tanishq Banyal 12 Mei 2021, 09:06

1 menjawab

Jawaban Terbaik

Jawabannya adalah bahwa floating point "rusak" - atau setidaknya tidak dipercaya untuk nilai pasti.

Dalam loop 1, ketika tiba-tiba mencetak 1,0, nilai sebenarnya sedikit lebih kecil (0,999...), jadi pemeriksaan bahwa itu kurang dari 1 masih benar.

Di loop 4, ketika Anda mengharapkannya untuk mencetak 1.0, nilai sebenarnya sedikit lebih tinggi (1.0001 atau sesuatu), jadi pemeriksaan apakah itu <= 1 gagal.

0
cptFracassa 12 Mei 2021, 07:17