01/10/2018, 11:27

Thắc mắc về vòng for với biến chạy i là kiểu số thực

có thể đây là câu hỏi hơi ngớ ngẩn tí nhưng ko biết có ai thắc mắc về việc dùng vòng for(i) với kiều số thực ko nhỉ?

HK boy viết 13:33 ngày 01/10/2018

Câu hỏi này hay phết mà, đâu có ngớ ngẩn gì đâu.

1 cách thuần tuý:

for (double i = 0.0; i < n; i += 1.0) {
}

Cẩn thận nhất là điều kiện thứ 2 của vòng for. i != n có thể dẫn đến lặp vô hạn, kiểu như

for (double i = 0.1; i != 0.3; i += 0.2) {
}

vì rất dễ xảy ra trường hợp 0.1 + 0.2 != 0.3 (99%).

Người ta không thể trực tiếp so sánh == khi sử dụng 2 số thực.
Cách so sánh 2 số thực a và b:

const eps = 1E-9; // 1 số rất bé
bool equal(a, b) {
    return abs(a - b) <= eps;
}

bool not_equal(a, b) {
    return abs(a - b) > eps;
}

So sánh lớn hơn, nhỏ hơn thì so trực tiếp được.

Tao Không Ngu. viết 13:39 ngày 01/10/2018

Hi Tungduong Nguyen.
1 Trong đặc tả câu lệnh for của C++ không có chỗ nào quy định kiểu dữ liệu.
2. Vòng for dùng cho trường hợp lặp số lần biết trước nghĩa là biến đếm là kiểu nguyên nên thường dùng với biến nguyên. Nếu cần dùng với biến thực thì tốt nhất nên chuyển sang dùng while.

HK boy viết 13:30 ngày 01/10/2018

for của C++ dùng như while được mà, có ai bắt nó gò bó vào là lặp với số lần khỉ m* gì đâu.

Tungduong Nguyen viết 13:41 ngày 01/10/2018

mình có test thì thấy rằng khi for số thực thì nó in ra ra số nguyên, mình nghĩ là ko thể dùng for cho số thực dc chứ nhỉ

HK boy viết 13:28 ngày 01/10/2018

Bạn thử up code demo mình xem.

Tao Không Ngu. viết 13:43 ngày 01/10/2018

Hi HK boy.
Vấn đề không phải là được hay không được. Với goto bạn có thể thay cho tất cả các loại vòng lặp. Tuy nhiên sao người ta vẫn tạo ra for và while ?. Việc chia ra lặp số lần biết trước và không làm code dẽ đọc hơn. Nếu bạn đọc các code mà chỉ số lặp index bị thay đổi trong vong lặp thực sự không dễ để hiểu logic.

Tungduong Nguyen viết 13:38 ngày 01/10/2018

HK boy viết 13:40 ngày 01/10/2018

Tại cái cout thôi. Nó tự động làm tròn số đấy.

wandbox.org

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include #include using namespace std; int main() { double a = 1.0000, b = 1.2000, c = 1.2300, d = 1.2340, e = 1.2345, f = 1.23456; cout << a << endl << b << endl << c <<

Tungduong Nguyen viết 13:40 ngày 01/10/2018

vậy là for vs số thực là ko thực hiện đc đúng ko

HK boy viết 13:43 ngày 01/10/2018

Thực hiện được. Mình có nói là không thực hiện được đâu?

wandbox.org

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include #include using namespace std; int main() { for (double i = 0.1; i < 1.0; i += 0.1) cout << i << endl; }

Tungduong Nguyen viết 13:42 ngày 01/10/2018

à ừ nhỉ, nó có i+=0.1, tại cứ nghĩ số thực có thế là 0.0000…1 nên nhầm, thank bạn nha

rogp10 viết 13:35 ngày 01/10/2018

Vòng for dùng cho trường hợp lặp số lần biết trước nghĩa là biến đếm là kiểu nguyên nên thường dùng với biến nguyên. Nếu cần dùng với biến thực thì tốt nhất nên chuyển sang dùng while.

Chả lan quyên đến thực hay nguyên gì, vì tính số phẩy động nó phải vậy rồi.

Mà for này có phải for pascal đâu, tùy trường hợp mà chọn for hay while.

Tao Không Ngu. viết 13:35 ngày 01/10/2018

Hi rogp10
Bạn nói rõ hơn được không ?
Bạn nói rõ hơn được không ?

rogp10 viết 13:38 ngày 01/10/2018

Nôm na như thế này:

  • Hệ thập phân biểu diễn chính xác các phân số tối giản có mẫu chỉ có thừa số 2 với 5, vì 10 chia hết cho 2 và 5, vậy 1/2 = 0.5 và 1/5 = 0.2 (Một chục bằng 10).
  • Hệ nhị phân thì mẫu số chỉ có thể là lũy thừa của 2 mới chính xác, do 2 nguyên tố. (Một “chục” bằng 2 :D)

Vậy cách gì hệ nhị phân (IEEE-754) biểu diễn chính xác được 0.1, 0.2 với cả 0.3 đây.

Tao Không Ngu. viết 13:35 ngày 01/10/2018

Hi rogp10.
Mình không nghĩ là nó liên quan đến ý mình.

rogp10 viết 13:43 ngày 01/10/2018

Mình đang nói chỗ không liên quan đấy đấy =) lôi for và while vào làm gì.

Tao Không Ngu. viết 13:30 ngày 01/10/2018

Hi rogp10.
Ý mình khi lặp số làn đếm được (biến đếm kiểu nguyên) thì dùng for còn không biết trước số lần thì dùng while (điều kiện thực)

HK boy viết 13:41 ngày 01/10/2018
for (double i = 0.1; i < 1.0; i += 0.1)

có số lần đếm được hay không đếm được hả bạn?

Tao Không Ngu. viết 13:37 ngày 01/10/2018

HI HK boy.
Không bạn ạ. i += 0.000001; Giữa hai số thực bất kỳ có vô số số thực nên đó là lý do máy tính làm tròn về gấn đúng nên khi so sánh hai số thực đôi khi gây lỗi. Với số nguyên thì không.

HK boy viết 13:42 ngày 01/10/2018

i += 0.000001;

Như thế vẫn là đếm được.

Bài liên quan
0