Hiển thị kết quả từ 1 đến 6 / 6

Chủ đề: -0.000000

  1. #1
    Tham gia
    01-11-2014
    Bài viết
    8
    Like
    1
    Thanked 0 Times in 0 Posts

    -0.000000

    #include<conio.h>
    #include<stdio.h>

    int main()
    {
    float tb=-1/12.0;
    if(1+12*tb!=0)
    printf("%f",1+12*tb);
    getch();
    return 0;
    }


    em sai ở đâu ạ mà nó ra kết quả là -0.000000
    -0.000000 vẫn khác 0 sao ạ?
    Nếu em sửa lại fabs(1+12*tb)!=0 vẫn ra true.

    mọi người giúp em chỗ này với. em nghĩ cả đêm qua tới giờ mà không được. Bực quá
    Được sửa bởi thungn lúc 14:54 ngày 14-02-2015
    TN.h
    Quote Quote

  2. #2
    Tham gia
    01-11-2014
    Bài viết
    8
    Like
    1
    Thanked 0 Times in 0 Posts
    tại sao 0*(-1/12)=0
    còn 0*(-1/12.0)=-0.000000
    TN.h

  3. #3
    Tham gia
    09-08-2009
    Location
    localhost
    Bài viết
    21
    Like
    1
    Thanked 3 Times in 3 Posts
    Quote Được gửi bởi thungn View Post
    tại sao 0*(-1/12)=0
    còn 0*(-1/12.0)=-0.000000
    Bạn phải ép kiểu float sang int, vd:

    int i = (int)(0*(-1/12.0));
    printf("%d", i); // = 0

  4. #4
    Tham gia
    01-11-2014
    Bài viết
    8
    Like
    1
    Thanked 0 Times in 0 Posts
    0*(-1/12)=0 vì 0*(1/12)=0*0=0
    1/12 là phép chia hai số nguyên nên C/C++ hiểu là phép chia lấy phần dư phải không ạ
    TN.h

  5. #5
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Con toán số thực không giống số nguyên.
    100 người học lập trình, 90 người thiếu sót phần này. 100 người dạy lập trình, 95 người thiếu sót phần này.

    Bài này đem đổ thừa cho ép kiểu là nhận định sai.

    Quote Được gửi bởi thungn View Post
    tại sao 0*(-1/12)=0
    còn 0*(-1/12.0)=-0.000000
    Trong code của bạn, đâu có chỗ nào đưa ra điều này! Bạn tự suy luận ra như vậy thôi. Bảo hàm printf nó in ra 24 chữ số sẽ thấy là suy luận trên không đúng.

    Code trên không phải sai ở con toán cộng trừ nhân chia. Nó sai ở con toán so sánh (toán tử !=)

    Nếu bạn còn muốn học lập trình toán số. Thì nên học số thực cho kỹ, và lặp lại câu này 50 lần:

    "Số thực không thể so sánh trực tiếp. Hai số thực không thể tuyệt đối bằng nhau. Người ta chỉ có thể coi chúng là bằng nhau khi chúng cách nhau một trị rất nhỏ"

    Khi làm toán với số thực. Người ta luôn luôn đặt ra một con số epsilon rất nhỏ (1.E-20 chẳng hạn). Khi so sánh 2 số thì xét math.abs(a-b) <= epsilon; nếu true thì coi như hai số bằng nhau.

    Thầy/cô dạy lập trình mà thiếu chỗ này là giáo viên dỏm.

  6. Thành viên Like bài viết này:


  7. #6
    Tham gia
    01-11-2014
    Bài viết
    8
    Like
    1
    Thanked 0 Times in 0 Posts
    Cảm ơn ạ. Em sẽ ghi nhớ Câu trên
    Số thực không thể so sánh trực tiếp. Hai số thực không thể tuyệt đối bằng nhau. Người ta chỉ có thể coi chúng là bằng nhau khi chúng cách nhau một trị rất nhỏ
    TN.h

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • 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
  •