cuốn sách gpt4 ai đã làm

c++ - val != std::numeric_limits::infinity() hoặc !isinf(val) hoặc isfinite(val)

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 18:37:32 29 4
mua khóa gpt4 Nike

đây có thể là đổ xe đạp , nhưng có lẽ tôi đang thiếu điều gì đó thú vị...

Nếu một lớp khởi tạo một thành viêngiá trịstd::numeric_limits::infinity()Sau đó muốn kiểm tra xem val đã được thay đổi thành thứ gì đó hợp lệ (+/- inf không hợp lệ ở đây hay chưa), sự đánh đổi của 3 cách tiếp cận này là gì và tôi có bỏ lỡ bất kỳ cách thú vị nào khác để giải quyết vấn đề này không. (Const đã bị xóa để dễ đọc trong các ví dụ.)

bool IsInit() { return MinX != std::numeric_limits::infinity() } // a

bool IsInit() { return !std::isinf(MinX); } // b

bool IsInit() { return std::isfinite(MinX); // c

Mã hiện tại là C++03, nhưng các tùy chọn sẽ thay đổi như thế nào với C++11, C++14 và C++17. Ví dụ: sử dụng C++17, mã này có thể chỉ là std::tùy chọn giá trị .Hoặc nếu +/-inf có sẵn trong tương lai, liệu NaN yên tĩnh có phải là lựa chọn an toàn hơn không?

Đây là những gì xuất hiện khi tôi đọc bản vá cho mã này:

Để dễ tham khảo:

Sắp xếp liên quan:

câu trả lời hay nhất

Việc sử dụng các giá trị đặc biệt này làm cờ khởi tạo chỉ hoạt động nếu biến không thể nhận được giá trị đặc biệt. Theo toán học, không khó để có được vô cực vì tràn cũng có được. Vì vậy, điều này có thể có vấn đề. Nếu hằng số duy nhất là người dùng không thể đặt giá trị dấu phẩy động này thành giá trị này thì việc sử dụng NaN yên tĩnh nếu có sẽ dễ dàng hơn.

Trong ba phương thức, chỉ có phương thức "a" khớp chính xác với giá trị ban đầu. Vì vậy, đây là cách tiếp cận chính xác nhất nếu bất biến là phương pháp chỉ biểu thị giá trị khởi tạo. Tất nhiên, không có phương pháp nào trong số này có tác dụng bảo vệ bất biến ngay từ đầu, tôi quan tâm hơn đến việc: liệu bất biến đó có thể được thực thi một cách hiệu quả hay không.

Mặc dù đây không phải là trang web đánh giá mã nhưng chỉ cần liên kết các chỉnh sửa mã tới OGREnvelope Còn về lớp trên github (hình như chỉ là AABB thôi), mình nghĩ có một số điểm cần lưu ý:

  • IsInit - dựa trên mã của nó - dường như nhằm trả về xem AABB có thực sự được người dùng đặt hay không. Không phải là nó ở trong một vị trí mà có thể nói rằng nó là IsInit Trạng thái/giá trị ban đầu được đề xuất (và khiến tôi tin tưởng). Cá nhân tôi thích Có hợp lệ Một cái tên như vậy cho bài kiểm tra này.
  • Về bản chất thực sự của các bất biến, bản thân các biên tập viên dường như nhận ra rằng AABB hợp lệ sẽ không bao giờ có MinX. lớn hơn MaxX Cũng không phải giá trị của Ylớn hơn MaxY .Nói cách khác, chúng không bao giờ được đảo ngược trong AABB hợp lệ. MinXLuôn luôn nhỏ hơn hoặc bằng MaxX (Tương tự với các biến Y tối thiểu và tối đa).
  • Việc sử dụng các giá trị vô cực ngược như bây giờ giúp: (a) dễ dàng tăng AABB hơn để bao gồm các AABB khác (được chỉnh sửa để thể hiện ý tôi bằng cách giảm các dòng mã từ 14 xuống 4 (b) giúp dễ xử lý hơn); hơn là sử dụng tối đa() Phạm vi AABB hiệu quả rộng hơn. Và thấp nhất()Giá trị (giá trị) xem.
  • MinX sự thật, MaxX , Y , MaxYCác biến thành viên có thể truy cập công khai có nghĩa là IsInitBản thân các bất biến chỉ mang tính chất tư vấn vì không có sự đóng gói để bảo vệ các bất biến.

Trong bối cảnh rộng hơn của việc lưu ý những điều này, NaN là không phù hợp. Bất biến không bao giờ đúngMinX != std::numeric_limits::infinity() .Và IsInit (được triển khai trong mã này) tốt nhất là không đầy đủ. nơi nó được đổi tên thành một cái gì đó như Có hợp lệ Trong ngữ cảnh của , thì cách triển khai nhất quán hợp lý hơn là:

bool IsValid() const
{
return !std::isnan(MinX) && !std::isnan(MinY) && MinX <= MaxX && MinY <= MaxY;
}

Với việc triển khai này, AABB hiệu quả sẽ được OGREnvelopeCác giá trị đều là số hợp lệ (không có NaN) và giá trị tối thiểu phải nhỏ hơn hoặc bằng giá trị tối đa tương ứng của X và Y.

Về c++ - val != std::numeric_limits::infinity() hoặc !isinf(val) hoặc isfinite(val), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/42930445/

29 4 0
Hồ Xil
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress