Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Lấy phần thập phân(máy lỗi hay mình lỗi).

  1. #1
    Ngày gia nhập
    03 2012
    Nơi ở
    Bình Thuận(đang học ở HCM)
    Bài viết
    2

    Mặc định Lấy phần thập phân(máy lỗi hay mình lỗi).

    em có đoạn code sau! chạy bằng tay nhiều lần thì vẫn thấy đúng nhưng bỏ vô Turbo C++ 3.0 DOSbox lại không hiển thị ra màn hình được chỉ toàn là số 0 không à!
    Anh chị xem giúp em nha! Thank! @@
    Code:
    #include<iostream.h>
    #include<conio.h>
    void main()
    {
              foat x,r;
              cout<<"\nNhap so thap phan can lay vao x = ";
              cin>>x;
              x=x-int(x);
              do
              {
               x=x*10;
               r=x-int(x); 
              }
              while(r!=0);/*chỗ xét dk có sai không ạ?*/
              cout<<"\nPhan thap phan can lay la: "<<x;
    getch();
    }

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    - Bạn nên xác định 1 điều rằng: máy ko bao giờ lỗi, vì nếu có lỗi phần cứng thì nó cũng chẳng khởi động vô được windows cho bạn dùng đâu. Chỉ có người mới có lỗi mà thôi.

    - Ko biết bạn chạy kiểu gì mà ra được 0, nhưng rõ ràng là đoạn code của bạn ko biên dịch được:
    foat x,r -> ko có kiểu foat, chỉ có kiểu float thôi
    Ép kiểu sang int là (int)x chứ ko phải int(x)
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    03 2012
    Nơi ở
    Bình Thuận(đang học ở HCM)
    Bài viết
    2

    foat do hồi sáng vội quá nên khi viết bài này thiếu ak!
    còn vấn đề (int) thì để mình thử lại cái nha! hihi thank anh nhiều nha!

  4. #4
    Ngày gia nhập
    03 2012
    Nơi ở
    Bình Thuận(đang học ở HCM)
    Bài viết
    2

    em mới sửa lại nak:
    Code:
    #include<iostream.h>
    #include<conio.h>
    void main()
    {
              float x,r;
              cout<<"\nNhap so thap phan can lay vao x = ";
              cin>>x;
              x=x-(int)x;
              do
              {
               x=x*10;
               r=x-(int)x; 
              }
              while(r!=0);
              cout<<"\nPhan thap phan can lay la: "<<x;
    getch();
    }
    nhưng bây giờ nó lại hoạt như vậy:
    VD như mình nhập 0.12345 thì xuất ra màn hình là: 12345 đúng.
    nhập số nguyên xuất ra: 0 (đúng).
    Nhưng khi nhập 1 số nữa(vd như 0.123456) thì nó lại bị đơ,
    không xuất ra dòng này "Phan thap phan can lay la: " và cũng không thể bấm "Entetr" để thoát đc!
    Nếu nhập khác 2 trường hợp trên vd như 1.2, 2.2, 123.231, ... thì nó cũng bị "đơ" như trên!
    Anh chị nào giúp em với dc không ạ?
    thank anh chị nhiều!

  5. #5
    Ngày gia nhập
    12 2009
    Nơi ở
    Thanh Xuan, HN, Vietnam
    Bài viết
    42

    Theo mình vấn đề là ở chỗ vòng lặp
    Code:
              do
              {
               x=x*10;
               r=x-(int)x; 
              }
              while(r!=0);
    Điều kiện r=0 để rất ít xảy ra nếu như quá trình làm tròn xảy ra khi bạn thực hiện nhân 10 rồi ép kiểu...
    Nếu bạn chỉ muốn lấy phần thập phân thì xem ở đây:
    http://diendan.congdongcviet.com/showthread.php?t=93767

    Full name: Nguyễn Đăng Quang
    Skype: mr.quanga3
    Gmail: dangquangk53a3@gmail.com
    Mobile: 0166.978.6636

  6. #6
    Ngày gia nhập
    03 2012
    Nơi ở
    Bình Thuận(đang học ở HCM)
    Bài viết
    2

    Mặc định Lấy phần thập phân(máy lỗi hay mình lỗi).

    Trích dẫn Nguyên bản được gửi bởi mr.quang Xem bài viết
    Theo mình vấn đề là ở chỗ vòng lặp
    Code:
              do
              {
               x=x*10;
               r=x-(int)x; 
              }
              while(r!=0);
    Điều kiện r=0 để rất ít xảy ra nếu như quá trình làm tròn xảy ra khi bạn thực hiện nhân 10 rồi ép kiểu...
    Nếu bạn chỉ muốn lấy phần thập phân thì xem ở đây:
    http://diendan.congdongcviet.com/showthread.php?t=93767
    Đúng rồi đó bạn khi test riêng ra thì nó vẫn không bằng 0! là sao trời! trên lý thuyết thì nó bằng 0 mà!
    Trên lý thuyết:
    VD như nhập số 1.2 thì x=1.2-1=0.2
    rồi sau đó là x=0.2*10=2
    tiếp theo là: r=2-2=0 chứ! vậy mà khi test riêng thì r = 4.768372e-07
    Anh chị nào giúp em với!
    Mình gà có người gà hơn mình! Nhưng ĐỪNG lấy đó mà TỰ CAO!
    Mình pro có người pro hơn mình! Nhưng ĐỪNG lấy đó mà TỰ TI!

  7. #7
    Ngày gia nhập
    12 2010
    Nơi ở
    Hà Nội
    Bài viết
    137

    Mặc định DingPhonh

    Vì số phẩy động ko thể được biểu diễn chính xác chỉ bởi hai số 0 và 1 (Lấy ví dụ đổi số thập phân trong hệ 10 ra số hệ nhị phân sẽ thấy), vì phần lớn là chúng "động" quá ko đủ bit để biểu diễn.
    C++ Code:
    1. double nominal = 1.0;
    2. double sum = 0.0;
    3.  
    4. for ( int i = 0; i < 10; i++ ) {
    5.    sum += 0.1;
    6. }
    7. if ( nominal == sum ) {
    8.    cout << "Numbers are the same.";
    9. }
    10. else {
    11.    cout << "Numbers are different.";
    12. }
    13.  
    14. //sum =
    15. 0.1
    16. 0.2
    17. 0.30000000000000004
    18. 0.4
    19. 0.5
    20. 0.6
    21. 0.7
    22. 0.7999999999999999
    23. 0.8999999999999999
    24. 0.9999999999999999
    Thử đổi float r => int r xem sao!
    Freelancer, free coder, free tester.
    Nhận hợp tác viết app, viết midlet khi free time.
    Tình trạng: Siêu bận!

  8. #8
    Ngày gia nhập
    02 2012
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi DingPhonh Xem bài viết
    Vì số phẩy động ko thể được biểu diễn chính xác chỉ bởi hai số 0 và 1 (Lấy ví dụ đổi số thập phân trong hệ 10 ra số hệ nhị phân sẽ thấy), vì phần lớn là chúng "động" quá ko đủ bit để biểu diễn.
    C++ Code:
    1. double nominal = 1.0;
    2. double sum = 0.0;
    3.  
    4. for ( int i = 0; i < 10; i++ ) {
    5.    sum += 0.1;
    6. }
    7. if ( nominal == sum ) {
    8.    cout << "Numbers are the same.";
    9. }
    10. else {
    11.    cout << "Numbers are different.";
    12. }
    13.  
    14. //sum =
    15. 0.1
    16. 0.2
    17. 0.30000000000000004
    18. 0.4
    19. 0.5
    20. 0.6
    21. 0.7
    22. 0.7999999999999999
    23. 0.8999999999999999
    24. 0.9999999999999999
    Thử đổi float r => int r xem sao!
    Nó sẽ thoát khỏi vòng lặp ngay từ đầu o_o

    Trích dẫn Nguyên bản được gửi bởi thientrang1203
    Đúng rồi đó bạn khi test riêng ra thì nó vẫn không bằng 0! là sao trời! trên lý thuyết thì nó bằng 0 mà!
    Trên lý thuyết:
    VD như nhập số 1.2 thì x=1.2-1=0.2
    rồi sau đó là x=0.2*10=2
    tiếp theo là: r=2-2=0 chứ! vậy mà khi test riêng thì r = 4.768372e-07
    Anh chị nào giúp em với!
    Mình có ý này: hay là bạn dùng 1/(x-(int)x) ở đầu để tính ra số lượng chữ số sau dấu phẩy của x.
    Vd: 0.2 thì 1/0.2 = 5 < 10 => 1 chữ số
    0.09 thì 1/0.09 = 11,11... > 10 => 2 chữ số
    v.v
    Sau khi đã có số lượng chữ số thì dùng vòng for để tìm thui

  9. #9
    Ngày gia nhập
    03 2012
    Nơi ở
    Bình Thuận(đang học ở HCM)
    Bài viết
    2

    Hihi trc tiên thank bạn nhiều nha!
    Nhưng nó bị giới hạn lấy n số ở sau!
    Mình gà có người gà hơn mình! Nhưng ĐỪNG lấy đó mà TỰ CAO!
    Mình pro có người pro hơn mình! Nhưng ĐỪNG lấy đó mà TỰ TI!

  10. #10
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Ví dụ như số PI, nếu phải in ra phần thập phân thì bạn in ra 14, hay là 1415926535, hay là không biết phải dài bao nhiêu nữa.

    Có những số thực không thể diễn tả chính xác bằng hệ nhị phân trong giới hạn số bits được hệ thống mặc định.

    Làm việc với số thực thì bắt buộc phải chấp nhận một sai số.

    Trước khi bạn hiểu cặn kẽ cấu trúc số thực và luật sai số chấp nhận thì đề bài này không khả thi.

Các đề tài tương tự

  1. TP HCM Công ty Cổ Phần Thế Giới Di Động Cần Tuyển 01 Trưởng Nhóm Quản lý Sản phẩm website
    Gửi bởi tuyendungtgdd trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 0
    Bài viết cuối: 08-11-2012, 02:14 PM
  2. Công ty Cổ Phần Thế Giới Di Động Cần Tuyển 01 Nhân viên Quản lý Sản phẩm web
    Gửi bởi tuyendungtgdd trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 0
    Bài viết cuối: 08-11-2012, 02:06 PM
  3. Nội thất văn phòng góp phần tạo nên thương hiệu sản phẩm
    Gửi bởi suka_mt trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 14-12-2011, 01:46 PM
  4. phần merge module bị thiếu crystal report phải làm thế nào ?
    Gửi bởi manhluc88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 06-01-2011, 01:11 PM
  5. Có phải khai báo thế này là đưa cấu trúc sinhvien vào mảng sv 100 phần tử
    Gửi bởi shumo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 03-06-2010, 08:18 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn