2011-11-02 35 views
6

của Apple CoreGraphics.framework, CGGeometry.h:phao so sánh (bình đẳng) trong CoreGraphics

CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize size2) 
{ 
    return size1.width == size2.width && size1.height == size2.height; 
} 
#define CGSizeEqualToSize __CGSizeEqualToSize 

Tại sao họ (Apple) so sánh nổi với ==? Tôi không thể tin rằng đây là một sai lầm. Vì vậy, bạn có thể giải thích cho tôi? (Tôi đã mong đợi một cái gì đó như fabs(size1.width - size2.width) < 0.001).

+2

Tôi không chắc chắn trường hợp sử dụng là gì khi sử dụng '==' ở đó nhưng tôi cho rằng nó đảm bảo yêu cầu Apple giải thích rằng trong tài liệu. –

Trả lời

3

So sánh điểm nổi là chiều rộng gốc trên tất cả các kiến ​​trúc OSX và iOS.

Đối float, mà nói đến:

i386, x86_64:

  • 32 chút XMM đăng ký (hoặc bộ nhớ cho toán hạng thứ hai)
  • sử dụng một hướng dẫn trong gia đình của ucomiss

ARM:

  • 32 bit đăng ký
  • sử dụng hướng dẫn trong cùng một gia đình như vcmp

Một số trong những vấn đề quan điểm so sánh nổi đã được loại bỏ bằng cách hạn chế lưu trữ để 32/64 cho các loại. Các nền tảng khác có thể sử dụng FPU 80 bit gốc (ví dụ). Trên OS X, các chỉ lệnh SSE được ưu tiên và chúng sử dụng độ rộng tự nhiên. Vì vậy, làm giảm nhiều vấn đề so sánh điểm nổi.

Nhưng vẫn còn chỗ cho lỗi hoặc thời điểm bạn sẽ ưu tiên xấp xỉ. Một chi tiết ẩn về giá trị của các loại CGGeometry là chúng có thể được làm tròn thành một số nguyên lân cận (bạn có thể muốn tự làm điều này trong một số trường hợp).

Với phạm vi CGFloat (float hoặc double -x86_64) và giá trị tiêu biểu, nên giả định các giá trị được làm tròn thường được biểu diễn đủ chính xác, sao cho kết quả sẽ được so sánh phù hợp trong phần lớn các trường hợp. Do đó, nó "khá an toàn", "khá chính xác" và "khá nhanh" trong những giới hạn đó.

Vẫn có những lúc bạn có thể thích so sánh xấp xỉ trong tính toán hình học, nhưng triển khai của Apple là những gì tôi xem xét gần nhất với triển khai tham chiếu cho giải pháp chung trong ngữ cảnh này.

Các vấn đề liên quan