Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
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ố 13 kết quả

Đề tài: Mũ 2 nhưng không chia hết cho 2???

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Mặc định Mũ 2 nhưng không chia hết cho 2???

    Mình có code sau
    C++ Code:
    1. #include <iostream>
    2. #include <cmath>
    3. using namespace std;
    4. int main()
    5. {
    6.     unsigned long long n=0;
    7.     cout<<n-1<<endl;
    8.     unsigned long long m=(unsigned long long)pow(2,64);
    9.     cout<<m<<endl;
    10.     cout<<m+1<<endl;
    11. /* kết quả là
    12. 18446744073709551615
    13. 18446744073709551615                                               0 */
    14. }
    Sao vậy nhỉ?

    - - - Nội dung đã được cập nhật ngày 13-11-2019 lúc 03:02 PM - - -

    Mình code
    C++ Code:
    1. cout<<(unsigned long long)pow(2,70);
    Kết quả cũng y như vậy
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    582

    pow(.,.) không cung cấp được độ chính xác để tính được 2^64 đúng đến từng bit. Nên kết quả là số chẵn hay số lẻ, tùy vào may rủi.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Thôi không cần trả lời nữa, nếu quá giới hạn nó sẽ lấy max

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    3,454

    Không hẳn như thế, nó tùy vào trình biên dịch và ..


    Uốn trục số thành vòng khép kín.

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    474

    https://en.cppreference.com/w/cpp/la...al_conversions

    A prvalue of floating-point type can be converted to a prvalue of any integer type. The fractional part is truncated, that is, the fractional part is discarded. If the value cannot fit into the destination type, the behavior is undefined (even when the destination type is unsigned, modulo arithmetic does not apply). If the destination type is bool, this is a boolean conversion (see below).
    undefined behavior

  6. #6
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Mặc định Mũ 2 nhưng không chia hết cho 2???

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    pow(.,.) không cung cấp được độ chính xác để tính được 2^64 đúng đến từng bit. Nên kết quả là số chẵn hay số lẻ, tùy vào may rủi.
    Ada nói cũng đúng, mình code
    C++ Code:
    1. #define bit64 unsigned long long
    2. #include <iostream>
    3. #include <cmath>
    4. using namespace std;
    5. int main()
    6. {
    7.     int i=0;
    8.     while(i<65)
    9.     {
    10.         cout.width(3);
    11.         cout<<i;
    12.         cout.width(8);
    13.         cout<<(bit64)(pow(2,i)-1)-((bit64)pow(2,i)-1);
    14.         cout<<endl;
    15.         i++;
    16.     }
    17. }
    18. //kết quả là
    19. /*
    20. 0       0
    21.   1       0                                                          2       0                                                          3       0                                                          4       0                                                          5       0                                                          6       0                                                          7       0                                                          8       0                                                          9       0                                                         10       0                                                         11       0                                                         12       0                                                         13       0                                                         14       0                                                         15       0                                                         16       0
    22.  17       0
    23.  18       0
    24.  19       0
    25.  20       0
    26.  21       0
    27.  22       0
    28.  23       0
    29.  24       0
    30.  25       0
    31.  26       0
    32.  27       0
    33.  28       0
    34.  29       0
    35.  30       0
    36.  31       0
    37.  32       0
    38.  33       0
    39.  34       0
    40.  35       0
    41.  36       0
    42.  37       0
    43.  38       0
    44.  39       0
    45.  40       0
    46.  41       0
    47.  42       0
    48.  43       0
    49.  44       0
    50.  45       0
    51.  46       0
    52.  47       0
    53.  48       0
    54.  49       0
    55.  50       0
    56.  51       0
    57.  52       0
    58.  53       0
    59.  54       1
    60.  55       1
    61.  56       1
    62.  57       1
    63.  58       1
    64.  59       1
    65.  60       1
    66.  61       1
    67.  62       1
    68.  63       1
    69.  64       1
    70. */
    Nếu nó tính chính xác đến từng bit thì đã không có mấy số 1 như trên

    - - - Nội dung đã được cập nhật ngày 14-11-2019 lúc 09:08 AM - - -
    @INPT
    Theo code trên của mình thì dù giá trị double fit trong ull nhưng vẫn bị truncate, à không, bị làm tròn lên?
    Đã được chỉnh sửa lần cuối bởi khoaph : 14-11-2019 lúc 09:15 AM.

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    3,454

    Với vc (Vs2010) nó báo lỗi biên dịch (dòng 13):
    error C2668: 'pow' : ambiguous call to overloaded function


  8. #8
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Với vc (Vs2010) nó báo lỗi biên dịch (dòng 13):
    error C2668: 'pow' : ambiguous call to overloaded function

    Cái đó hình như chỉ cần thay thành
    C++ Code:
    1. pow((double)2,i)
    là được
    Không biết trong vs kết quả có khác trên không nhỉ?

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    474

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    @INPT
    Theo code trên của mình thì dù giá trị double fit trong ull nhưng vẫn bị truncate, à không, bị làm tròn lên?
    2^64 có fit trong ull đâu? ull có giá trị từ 0 tới 2^64 - 1 mà

  10. #10
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Trích dẫn Nguyên bản được gửi bởi INTP Xem bài viết
    2^64 có fit trong ull đâu? ull có giá trị từ 0 tới 2^64 - 1 mà
    Code mình nói là code trong bài #16
    Ở dòng 13 mình có tính 1 công thức
    và giá trị công thức đó với i trong khoảng [54,64] đều =1 nên mình cho rằng chúng đều do cùng 1 nguyên nhân từ hàm pow?
    Mình hơi hồ dồ rồi.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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