2012-03-31 30 views
5

Tôi đang trong quá trình tạo một chương trình tạo các vectơ thử nghiệm được sử dụng trong một testbench VHDL. Testbench về cơ bản kiểm tra một phần cứng hoạt động như một trình bổ sung điểm chính xác đơn lẻ, do đó các vectơ sẽ tuân theo chuẩn IEEE 754.Chuyển đổi từ phao sang BigDecimal sau đó có nguy hiểm không?

Dù sao, kế hoạch hiện tại của tôi cho thế hệ là chuyển đổi giá trị phao sang BigDecimal, thực hiện các arithmatic cần thiết, sau đó chuyển trở lại float. Điều này có nguy hiểm không? Độ chính xác có bị mất dẫn đến kết quả có khả năng không chính xác trong vectơ thử nghiệm không? Tôi muốn chuyển đổi thành BigDecimal, vì vậy tôi có thể tránh các vấn đề làm tròn.

Vì vậy, điều này có thể cắt ngắn kết quả không?

BigDecimal repA = new BigDecimal(Float.toString(A)); 
BigDecimal repB = new BigDecimal(Float.toString(B)); 
BigDecimal repResult = repA.add(repB); 
float result = repResult.floatValue(); 

Trong trường hợp A và B nổi lên.

+0

Bạn chắc chắn sẽ mất một số độ chính xác vì phao không thể đại diện cho tất cả các số phân số có thể. – anubhava

+0

Có cách nào mà tôi có thể thực hiện điều này bằng cách không mất bất kỳ độ chính xác nào không? – Franklin

+1

Bạn cho rằng bạn cần nó chính xác đến mức nào? –

Trả lời

5

Nếu mục tiêu của bạn là có các véc tơ nổi 32 bit chính xác trong giới hạn dự kiến ​​của phao, thì tôi thích cách tiếp cận của bạn. Trước tiên, bạn chuyển đổi từ phao 32 bit sang đối tượng có độ chính xác cao hơn, thực hiện một vài bước để tính toán, sau đó chuyển đổi trở lại điểm nổi 32 bit. Cuối cùng, lỗi làm tròn của bạn có thể sẽ thấp hơn nếu bạn đã thực hiện cùng một loạt các bước tự nhiên trong các phao 32 bit của bạn.

Nếu mục tiêu của bạn là mô phỏng chính xác kết quả mong đợi của một phần cứng đang thực hiện tính toán tự nhiên bằng cách sử dụng phao 32 bit, thì bạn có thể gặp rủi ro báo cáo sai sự cố do tính toán của bạn được thực hiện với độ chính xác cao hơn hơn phần cứng đang được thử nghiệm.

+0

Tôi đã chỉnh sửa câu hỏi của mình. Tôi đang nghĩ phải không? – Franklin

+0

Dựa trên ví dụ của bạn, tôi không thấy rằng bạn đã tránh bất kỳ vấn đề làm tròn nào. Nếu bạn chỉ ngẫu nhiên tạo các vectơ là float, chuyển đổi chúng thành Strings, chuyển đổi Strings thành BigDecimal, thêm, sau đó chuyển đổi lại thành float, thì bạn sẽ không thể làm gì tốt hơn việc thêm các float. – phatfingers

+0

Xem phần phần cứng được mô hình cắt ngắn các giá trị trái với vòng. Vì vậy, một phần của phần mềm của tôi là tạo ra các vectơ ngẫu nhiên cùng với các trường hợp cạnh. Tôi không thể có kết quả được làm tròn hoặc các thử nghiệm khác sẽ vô dụng vì phần cứng cắt ngắn. – Franklin

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