Hm, chỉ cần xuất hiện trong quy trình DawsonCompare
trong Lập trình trò chơi Đá quý 6, đó là một bit-cast bình thường theo sau là một dấu lật (kể từ khi nổi âm để đối diện với số nguyên âm). Tôi sẽ mượn ý tưởng đó.
Bạn có:
// utility
template <typename R, typename T>
R& bit_cast(T& pX)
{
return reinterpret_cast<R&>(pX);
}
// int32_t defined in <boost/cstdint.hpp>.
boost::int32_t float_to_int_bits(float pX)
{
boost::int32_t x = bit_cast<boost::int32_t>(pX);
if (x < 0)
x = 0x80000000 - x;
return x;
}
Nếu bạn có thể đảm bảo bạn int
là 32 bit, bạn chỉ có thể sử dụng.
Thực tế thú vị: Cuốn sách tiếp tục sử dụng này (lưu ý, không phải với mã chính xác tôi trình bày, kể từ khi tôi đã tách ra một phần float-to-int) để so sánh các giá trị dấu chấm động với sự khoan dung:
bool DawsonCompare(float pX, float pY, int pDiff)
{
int x = float_to_int_bits(pX);
int y = float_to_int_bits(pY);
int diff = x - y;
return abs(diff) < pDiff;
}
Điều này so sánh nổi như true nếu đại diện số nguyên của chúng nằm trong một phạm vi nhất định. (Anh ta sử dụng 1000 làm mặc định tốt). Phiên bản chi nhánh ít được gọi là LomontCompare
được trình bày với cùng một ý tưởng, nhưng bạn phải mua sách đó. :)
Vâng, tôi nghĩ rằng tôi đã nhìn thấy một ánh xạ như trước đây - nó được khá thông minh - Tôi chỉ ước tôi có thể nhớ * nơi * tôi đã thấy nó ... –
Tôi có thể yêu cầu trường hợp sử dụng của bạn cho một bản đồ như vậy không? –
+1 câu hỏi tuyệt vời –