Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    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 ý.

  2. #2
    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

  3. #3
    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..

  4. #4
    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]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •