2011-10-28 32 views
7

Tôi đang lưu trữ nhiều kinh độ và vĩ độ như doubles, tôi tự hỏi liệu mình có thể cất giữ chúng với floats hay không.Độ phân giải gần đúng của một số dấu chấm động chính xác đơn khi số không xung quanh số

Để trả lời câu hỏi này, tôi cần biết độ phân giải gần đúng của single precision floating point number khi giá trị được lưu trữ là kinh độ/vĩ độ (-180 đến +180).

+2

Độ dài thay đổi từ -180 đến 180 và vĩ độ từ -90 đến 90. – caf

+0

Điểm tốt, bị bệnh đúng. – Robert

Trả lời

12

Câu hỏi của bạn có thể có một số cách giải thích.

Nếu nó chỉ dành cho góc và lưu trữ trên đĩa hoặc trên thiết bị, tôi khuyên bạn nên lưu trữ giá trị của mình bằng kỹ thuật hoàn toàn khác: lưu trữ dưới dạng số nguyên 32 bit.

int encodedAngle = (int)(value * (0x7FFFFFFF/180.0)); 

Để khôi phục, ngược lại.

double angle = (encodedAngle/(0x7FFFFFFF/180.0)); 

Bằng cách này, bạn có độ phân giải 31 bit đầy đủ cho 180 độ và 1 bit cho dấu.

Bạn có thể sử dụng cách này để giữ giá trị của bạn trong ram, chi phí của lớp phủ này cao hơn so với làm việc trực tiếp với đôi, nhưng nếu bạn muốn giữ bộ nhớ của bạn thấp nhưng độ phân giải cao này có thể hoạt động khá tốt. Chi phí không quá cao, chỉ một chuyển đổi từ/đến số nguyên và/hoặc nhân đôi, bộ vi xử lý hiện đại sẽ làm điều đó trong một khoảng thời gian rất ngắn, và do bộ nhớ truy cập ít hơn, nếu danh sách chứa nhiều của các giá trị, mã của bạn sẽ thân thiện hơn với bộ nhớ cache của bộ xử lý.

độ phân giải của bạn sẽ 180/((2^31) - 1) = 8.38190318 × 10^-8 độ, không xấu :)

+0

Anh ấy không thể sử dụng số nguyên không dấu vì anh ấy phải đại diện cho các giá trị từ -360 đến 360. Câu trả lời hay. –

+2

Đối với lat/long, + -360 chắc chắn là một yêu cầu không có thật ... Dù sao câu trả lời này là chính xác, và sử dụng điểm nổi chắc chắn là sai, trừ khi bạn muốn chính xác tuyệt vời gần London và quantization khủng khiếp ở Thái Bình ... –

+0

được -180 .. + 180 –

5

Độ phân giải bạn có thể dựa vào với các phao chính xác đơn là khoảng 360/(2^23) hoặc 4 * 10^-5.

Chính xác hơn, phao có độ chính xác đơn lớn nhất thấp hơn 360. (có thể đại diện chính xác) là khoảng 359.999969. Đối với toàn bộ phạm vi -360. .. 360, bạn sẽ có thể thể hiện sự khác biệt ít nhất là nhỏ như sự khác biệt giữa hai số này.

+0

Tuyệt vời, bằng cách tính toán của tôi thats xung quanh tối đa là 5 mét cho một lon/lat, mà không phải là chấp nhận được đối với tôi. Cảm ơn bạn đã giúp đỡ! – Robert

+1

@Robert Khi bạn cần độ phân giải đồng nhất, các định dạng dấu chấm động hơi lãng phí (mặc dù tôi thừa nhận chúng rất tiện lợi). Với các phao nổi chính xác, độ phân giải bị hạn chế bởi phần mềm 23 bit khi bạn có thể có 2^32 giá trị khoảng cách đều nhau.Đối với độ chính xác gấp đôi, độ phân giải bị giới hạn bởi mantissa 52 bit, nơi bạn có thể sử dụng tất cả 64 bit để biểu thị các giá trị khoảng cách đều nhau. –

1

Thông thường phao là 4 byte (32 bit) trong khi gấp đôi gấp đôi. Tuy nhiên, độ chính xác chính xác nếu bạn đang tính toán là thực hiện (và phần cứng) cụ thể. Trên một số hệ thống, tất cả các phao nổi sẽ được lưu trữ làm tăng gấp đôi, chỉ để thêm vào sự nhầm lẫn.

0

Phụ thuộc, mà đúng hơn là không.

Cửa hàng nổi 32 bit 7 chữ số có nghĩa. Đó là bình thường quá ít để lưu trữ độ phân giải kinh độ/vĩ độ thích hợp. Ví dụ: openstreetmap.org sử dụng sáu chữ số sau dấu phẩy, vì vậy tối thiểu tám, tổng số tối đa mười chữ số.

Tóm lại, sử dụng float64.

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