2012-01-18 32 views
5

Tôi đang làm việc theo quy trình tối ưu hóa Nelder-Mead trong C có liên quan đến việc lấy trung bình của hai số float s. Trong các trường hợp hiếm hoi (nhưng có thể tái sản xuất hoàn toàn), hai số float s, giả sử xy, chỉ khác nhau ít nhất có ý nghĩa về tầm quan trọng của chúng. Khi tính trung bình được thực hiện, làm tròn lỗi ngụ ý rằng kết quả sẽ là x hoặc y.Làm cách nào để chỉ định hướng nào để làm tròn trung bình của hai phao nổi khác với LSB của tên miền?

Tôi muốn chỉ định rằng làm tròn phải luôn hướng về phía thứ hai float. Tức là, tôi không thể chỉ đơn giản xác định rằng làm tròn phải hướng về số không, hoặc vô cùng, bởi vì tôi không biết trước cho dù x sẽ lớn hơn y.

(Làm cách nào) tôi có thể làm điều đó?

+3

Bạn không thể chỉ so sánh hai phao đó, và đặt làm tròn thành số không, trừ vô cực hoặc cộng với vô cực tùy thuộc vào kết quả so sánh? –

+0

Nhưng bạn có thể xác định tại thời điểm bạn làm tròn cho dù 'x> y', phải không? –

+0

Bạn có thể, nhưng có một cách đơn giản hơn nhiều để thực hiện việc này. –

Trả lời

2

Tôi không nghĩ rằng có chế độ làm tròn phần cứng cho điều đó. Bạn phải viết hàm của riêng mình, sau đó,

double average(double x, double y) { 
    double a = 0.5*(x+y); 
    return (a == x) ? y : a; 
} 
+0

Đây là những gì tôi sắp đề xuất. Bất kể chế độ làm tròn, 'a' chỉ có thể bằng' x' nếu (a) điều kiện được mô tả nắm giữ, hoặc (b) 'x == y'. Trong cả hai trường hợp, điều này tạo ra kết quả mong muốn và thực hiện rất hiệu quả. –

0

Bạn có thể nhận ra trường hợp đặc biệt và chọn giá trị bạn muốn trả lại.

Các giá trị được quan tâm là:

  • Khi các giá trị có dấu hiệu tương tự và số mũ và chỉ khác nhau bởi một trong mantissa.

  • Khi các giá trị có cùng dấu, số mũ khác nhau, và số mũ có số mũ lớn hơn có giá trị bằng 0 và số còn lại là số mũ.

Trong thực tế, nếu bạn đang sử dụng IEEE-754 số (mà có thể là), bạn có thể thực hiện cả hai bài thi cùng một lúc (sau khi kiểm tra cho những thứ như Zero, Inf, và Nan):

if ( repr1 + 1 == repr2 
    || repr2 + 1 == repr1) 
    .... 

Lý do cho điều này là số mũ được đặt ngay bên cạnh phần định trị, và nếu mantissa là tất cả, thì phần bổ sung sẽ tiếp tục vào trường số mũ.

Tuy nhiên, nói về điều này, tôi sẽ đề xuất một chiến lược khác. Thay vì chỉ trả lại số thứ hai, bạn có thể kiểm tra bit quan trọng thứ hai và quyết định xem bạn muốn làm tròn lên hay xuống. Bằng cách đó các lỗi làm tròn sẽ được phân phối đồng đều.

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