-
14-08-2014, 03:31 PM #1
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
setprecison(n) cho ra 2 KQ với float, double
Chào các bạn. Mình làm 1 bài về định dạng dữ liệu xuất ra như sau:
#include<iostream>
using namespace std;
#include<windows.h>
#include<iomanip>
int main(void)
{
float a=12.567, b=15.234567, c=20;
cout<<setprecision(10)<<" a = "<<a<<endl;
cout<<setprecision(10)<<" b = "<<b<<endl;
cout<<setw(10)<<" c = "<<c<<endl;
system("pause");
return(0);
}
và khi chạy kết quả ra như sau:
a=12.56700039
b=15.23456669
c=20
c=20 thì là bình thường.
còn a và b xuất ra bị sai kết quả
và khi thử thay float sang double thì kết quả đầu ra lại đúng 100%.
theo mình biết là float có độ rộng dữ liệu là 4 byte, mình chưa hiểu tại sao lại ra sai như vậy.
Mong các bạn góp ý.
-
14-08-2014, 03:34 PM #2
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
C# xài .NET 4.0 không có bignum thì phải, gu gồ thì thấy lên 4.5 có System.Numerics.BigInteger rồi
-
14-08-2014, 04:05 PM #3
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
http://en.wikipedia.org/wiki/Single-precision_floating-point_format
dài quá + tiếng Anh ngại đọc thì đơn giản là số thực được lưu trong 32-bit float thì 1 bit là để lưu dấu (âm/dương), 8 bit là lưu độ lớn, ~23-24 bit còn lại là lưu độ chính xác. Vì chỉ có khoảng 23-24 bit nên chỉ có thể biểu diễn được tối đa 2^24 số ~ 16 000 000 => chính xác chỉ được 7 chữ số. Vd muốn biểu diễn số có 8 chữ số 23 456 789 > 16 000 000 thì 24 bit này ko thể biểu diễn được.
những số có dạng k = m * 2^n trong đó m, n là số nguyên thì chính xác tuyệt đối. Đương nhiên là k cũng ko chính xác quá 7 chữ số nổi...
trong chương trình trên thì setw(10) là dư quá độ chính xác của float, chỉ chính xác được khoảng 7 chữ số.
12.567 => 12.56700 là chính xác
15.234567 => 15.23456 là chính xác, chữ số 7 cuối cùng thì không.
20 = 20 x 2^0 => chính xác tuyệt đối
http://en.wikipedia.org/wiki/Double-precision_floating-point_format
với kiểu double thì có tới 53 bit được sử dụng để lưu độ chính xác => chính xác khoảng log10(2^53) = 53 * 0.301 ~ 15.953 => chính xác 15-16 chữ số => setw(10) thì 10 < 15 nên 10 số này chính xác.
chỉ nhớ là float chính xác 7 chữ, double chính xác 16 chữ là được @_@ Số thực 128-bit thì chính xác 34 chữ số, vậy nhớ mẹo thì nhớ float=7 là đủ. double=7x2+2=16, decimal (kiểu này có trong C# ko có trong C++ đừng tìm @_@)=16x2+2=34..
-
14-08-2014, 05:16 PM #4
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Dự là ko tới 15.953 chữ số đâu [IMG]images/smilies/smile.png[/IMG]
Mình tưởng Decimal là BigNum trá hình muh [IMG]images/smilies/smile.png[/IMG]
NGUỒN SỈ ÁO KHOÁC DENIM NỮ TPHCM CHẤT LƯỢNG CAO Bạn muốn nhập sỉ áo khoác denim nữ để bắt đầu việc buôn bán Online phong cách nhưng lại chưa có kinh nghiệm, muốn sắm xưởng sỉ xống áo vừa có thể giải...
Xưởng sỉ áo khoác jeans denim giá...