2011-12-16 33 views
5

Cho double x và giả định rằng nó nằm trong [0,1]. Giả sử ví dụ rằng x = 0,3 Trong nhị phân, (giữ 10 chữ số sau dấu thập phân), nó được thể hiện dưới dạngTrích xuất các chữ số từ phao C++

x=0.0100110011... 

Tôi muốn viết một số mã C++ mà sẽ trích 10 chữ số hiển thị sau dấu thập phân . Nói cách khác, tôi muốn trích xuất số nguyên (0100110011) _2.

Bây giờ tôi khá mới để chút chuyển và (ngây thơ) giải pháp mà tôi có cho vấn đề là sau

int temp= (int) (x*(1<<10)) 

Sau đó temp trong hệ nhị phân sẽ có necesary 10 chữ số.

Đây có phải là cách an toàn để thực hiện quy trình trên không? HOẶC có cách nào an toàn hơn/đúng hơn để thực hiện việc này không?

Lưu ý: Tôi không muốn các chữ số được trích xuất dưới dạng mảng ký tự. Tôi đặc biệt muốn một số nguyên (OR số nguyên unsigned) cho việc này. Lý do để làm điều này là trong thế hệ octrees, các điểm trong không gian được đưa ra các khóa băm dựa trên vị trí của chúng được đặt tên là Khóa Morton. Các khóa này thường được lưu trữ dưới dạng số nguyên. Sau khi nhận được các phím tích hợp cho tất cả các điểm, chúng được sắp xếp. Về mặt lý thuyết, các khóa này có thể thu được bằng cách chia tỷ lệ tọa độ thành [0,1], trích xuất các bit và xen kẽ chúng.

+4

10 chữ số nhị phân hoặc chữ số thập phân? –

+0

Tại sao không in toàn bộ * mantissa *, với nhiều số không được thêm vào khi cần thiết? –

+0

@ Oli Charlesworth: Vui lòng xem chỉnh sửa. Tôi đã làm rõ câu hỏi của mình. – smilingbuddha

Trả lời

1

Sử dụng memcpy để sao chép đôi vào một mảng các số 32-bit, như thế này:

unsigned int b[2]; // assume int is 32-bits 
memcpy(b, &x, 8); 

10 nhất đáng kể chữ số nhị phân là trong b[0] hoặc b[1], tuỳ thuộc vào việc máy tính của bạn là big- hoặc ít -endian.

CHỈNH SỬA: Có thể đạt được điều tương tự bằng cách truyền một số thay vì ghi nhớ, nhưng điều đó sẽ vi phạm các quy tắc bí danh nghiêm ngặt. Cách khác là sử dụng union.

+1

+1 để đề cập đến nhiều tùy chọn. –

+0

OP yêu cầu 10 chữ số sau dấu thập phân, chứ không phải 10 chữ số quan trọng nhất. Vì vậy, số mũ cũng phải được tính đến. (Nhưng giải pháp được đề xuất của OP là hoàn toàn đủ cho nhiệm vụ, mà không cần phải băm nhỏ bit.) – TonyK

0

đọc này: http://chrishecker.com/images/f/fb/Gdmfp.pdf

Nếu bạn có thể grok những gì bài viết đó là nói cho bạn, bạn có thể lấy được các thuật toán bạn đang tìm kiếm. Chỉ cần nhớ các yếu tố thiên vị trong số mũ và một trong những hàng đầu tiềm ẩn trong phần định trị và phần còn lại sẽ rơi vào vị trí.

+0

ack, lỗi đọc hiểu. Giải pháp ngây thơ của bạn cũng hoạt động tốt.Bài viết ở trên là thông tin tốt anyway. – mcmcc

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