01/10/2018, 13:34
Vòng for với số thực
Em có một vi dụ về vòng for:
ví dụ 1:
for(int i = 0.0 ; i != 1.0;i+=0.1)
ví dụ 2
for(int i = 0.0 ; i != 10.0 ; i+=1)
về cơ bản thì em thấy 2 ví dụ này khá giống nhau, ở đây không bản đến các lỗi khác, em chỉ thắc mắc là tại sao ví dụ 1 lại chạy vô hạn vì dĩ nhiên là 1.0 của i khi tăng lên sẽ khác với 1.0 nó so sánh nhưng tại sao ví dụ 2 lại chạy được đúng 10 lần vậy ạ.
Em cám ơn.
Bài liên quan
Đổi 0.1 ra nhị phân (lấy khoảng 64 chữ số). Sau đó lấy 64 chữ số nhị phân đó đổi lại hệ thập phân.
Đổi 1.0 ra hệ nhị phân, sau đó lấy số nhị phân vừa đổi đổi lại ra thập phân.
Làm như trên sẽ thấy được vấn đề.
Đọc thêm: http://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/
À mà ví dụ trên nên đổi thành
double i
hoặcfloat i
sẽ đúng với ý của bạn hơn. Vìint i
như trên sẽ có cách giải thích khác.23 thôi 64 thì hơi nhiều
Còn 1.0 thì quá đẹp rồi. Số nguyên mà còn nguyên dạng thì tối đa là 2^24 - 1 (do bit 1 đầu mặc nhiên có).
nếu như em hiểu thì cái vòng for thứ 2 cũng phải chạy vô hạn chứ, sao nó lại chạy đúng 10 lần vậy anh.
sao lại 24 vậy anh, em chưa hiểu chỗ đấy lắm.
Câu trước có liên quan đến câu sau.
nè :3
https://www.h-schmidt.net/FloatConverter/IEEE754.html
Vô link trên đổi số 0.1 và coi cái Value actually stored in float
Sau đó đổ 1.0 và cũng coi cái Value actually stored in float
Rồi thử ngẫm xem tại sao nó lại 1 cái vô tận 1 cái ok thử xem.
nếu float thì là 4 byte => 32 bit, em chưa hiểu tại sao lại giảm 8 bit
Ok, em cám ơn ạ. Anh có hiểu đươc anh @rogp10 nói đến 24 bit kia là sao không ạ, em chưa tìm được sự liên quan ạ.
Ý anh rog10 là cái này nè:
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
Cũng sẽ hơi khó hiểu khi đọc đó
em cám ơn ạ, cái này em đã được học trong môn tin đại cương, thầy giáo cũng chỉ nêu công thức chứ không có giải thích gì , em cũng chỉ biết khi biểu diễn số thực theo công thức
và được hướng dẫn áp dụng công thức này:
thực sự em chưa hiểu tại sao với 32 bit thì lại là 8 bit e và tương tự với 64 và 80 bit, anh có thể giải thích cho em về điều đó được không ạ, về ý nghĩa của e với m , em cố gắng đọc và gg nhưng em chưa hiểu lắm.
Muốn hiểu bạn phải hiểu được Scientific Notation
Thì e là phần lưu trữ exponent và m là phần mantissa.
Ở hệ 10 Scientific Notation của 1 số là m10e
Ở hệ 2 là m2e
Quote trên thì ở hệ 10, 2.3 * 103. 2.3 là phần mantissa và số mũ 3 là phần exponent.
Ở hệ 2 thì lấy vd 1.25 * 22. Ta sẽ có 1.25 lưu ở mantissa (chữ m đó) và số 2 mũ lưu ở exponent (chữ e).
Vì sao phải biểu diễn bằng Scientific Notation? Vì như vậy sẽ có kết quả lớn hơn với lượng bit tương đương.
Như nếu dùng 32 bit thuần, ta chỉ biểu diễn được 2^32 giá trị ~ 4 tỷ. Nhưng với Scientific Notation thì sẽ biểu diễn được
1*(1.999999999)*(2127) ~ 3.40282367* 1038
(tối đa của mantissa là 1.999999999 ~ 2, và tối đa của e là 254 , nếu e = 256 thì số đó biểu diễn là NaN (Not a Number) or Inf nếu m = 0)
Còn vì sao chọn exponent là 8 bit thì cái này mình chờ ng khác giải đáp giúp vậy. Vì mình cũng không rõ tại sao :v
Không hẳn, đó chỉ là khoảng giữa số lớn nhất và 0 mà thôi. Còn số số biểu diễn được sẽ nhỏ hơn 2^32 số.
Dễ thấy float có 1 bit dấu + 7 bit mũ = 8 bit vừa đúng 1 byte quá đẹp (double có 23 bit mũ). Ngoài ra có hằng số Avogadro ~ 6.0210^23 và hằng số Planck ~ 6.62610^(-34) Js. Vì vậy 7 bit cho số mũ là tối thiểu.
em cám ơn anh. em tưởng e tối đa là 255 chứ ạ.
em cám ơn anh, mắc dù vẫn còn nhiều thứ khó hiểu
Đúng là 255, xin lỗi mình hơi ẩu.