Lỗi khi cài đặt kiểu dữ liệu, double và float
cpp.sh/64t4z (em post code ở đây vì nó có thể chạy trực tuyến được ạ)
Chào mọi người,
Trong code từ page đính kèm, em nhập vào bộ giá trị
Fraction 1: numerator = 7846, denominator = -7.8
Fraction 2: numerator = 142, denominator = 10.01
Tại dòng thứ 6 của code, khi em để
float iNumerator, iDenominator;
thì chương trình có thể chạy được
nhưng khi em để
double iNumerator, iDenominator;
thì chương trình KHÔNG thể chạy được
Em đã chạy trên cpp.sh và cả VS2013 nhưng đều không được
Theo em nghĩ thì miền giá trị của double lớn hơn miền giá trị của float thì đáng lẽ ra chương trình phải chạy được nhưng ở đây thì không
Mong mọi người giúp em
ở đây bạn hơi bị nhầm lẫn định nghĩa phân số thì phải?
định nghĩa phân số là số có thể biểu diễn dưới dạng p/q, với p, q là số nguyên và q khác 0.
trong code để tử mẫu là dạng số thực thì phân số cái gì ở đây ~.~
Mình xem qua code thì ở đoàn này
while (iNumerator - (int)iNumerator != 0 || iDenominator - (int)iDenominator != 0) { iNumerator = iNumerator * 10; iDenominator = iDenominator * 10; }
với trường hợp 10.01 thì đâu có được nhỉ. Bạn chỉ nhân thêm 10. Vẫn còn 100.1 !!!
Với Phân số thì tử và mẫu sao lại là số thực được nhỉ ?
Góp ý thêm chút. Bạn có thể dùng operator overloading để thực hiện các phép toán mà không cần gọi hàm
đó là vòng while mà. 100.1 nó nhân lên thành 1001.0000000000000000000000001 v.v… rồi 10010.000000000000000000000001 v.v… rồi tới khi quá mức chứa của int thì (int)iDenominator sẽ ra số âm hay số khỉ ho cò gáy nào đó, iDenominator - (int)iDenominator != 0 sẽ luôn khác 0 => vòng lặp chạy mãi.
chung quy vẫn là phân số mà đi xài số thực ~.~ Số thực trong hệ nhị phân ko thể biểu diễn 1/5 chính xác được, trong khi hệ thập phân lại biểu diễn 1/5 được, nên 10.01 thì 0.01 hệ thập phân biểu diễn được cứ tưởng hệ nhị phân sẽ chứa chính xác 0.01 ~.~
Chết Quên cái vòng while kia
Sorry bác nhá
Chỗ đó là vòng lặp khi nào mà tử hoặc mẫu vẫn còn phần thập phân phía sau thì cứ nhân thêm 10, cho đến khi tử hoặc mẫu không còn phần thập phân phía sau, nghĩa là khi đó thì tử và mẫu đều là số nguyên
Vậy có cách nào cho nó hiệu quả ko bác, như mình dùng máy tính casio để tính tổng 2 phân số với tử/ mẫu là số thực thì nó vẫn cho mà phải ko?
số thực đơn giản thôi chứ số thực mà có 10 chữ số ở phần thập phân thì nó cũng đâu biểu diễn thành phân số được. Bỏ cái số thực đi.
còn bạn muốn như Casio thì đừng xài float hay double. Xài string ấy. “7864”, “-7.8”, “142”, “10.01” rồi tha hồ mà tính theo phương pháp tiểu học.
nếu xài số nguyên thì phải coi chừng tràn số, ví dụ 1/12321 + 1/98789
Cảm ơn bác rất nhiều