Altifigence Academy

53 / 63 · Khái niệm

Dấu chấm cố định, làm tròn và bão hòa

Xác định phạm vi số theo định dạng W,F, thiết kế làm tròn về số chẵn bằng guard·sticky và bão hòa sau làm tròn.

Kiến thức cần có: độ rộng bit của phép cộng và nhân signed, dịch phải số học và overflow.

Quy định vị trí dấu chấm trong chuỗi bit

Số dấu chấm cố địnhSố dấu chấm cố định Cách biểu diễn số ấn định trước vị trí dấu chấm và áp dụng một hệ số tỉ lệ cố định cho chuỗi bit nguyên. Phải quy định đồng thời độ rộng, dấu và số bit phần lẻ. diễn giải số nguyên X thành x=X2−Fx=X2^{-F}. Phần cứng không lưu một bit dấu chấm. Bài này định nghĩa W là tổng độ rộng signed, bao gồm bit dấu, và F là số bit phần lẻ. Ký hiệu Q giữa các tài liệu không thống nhất về việc phần nguyên có gồm bit dấu hay không, nên ghi cả W,F trong giao diện sẽ rõ ràng hơn.

−2W−1−F≤x≤2W−1−F−2−F-2^{W-1-F}\le x\le 2^{W-1-F}-2^{-F}

Với W=8,F=4, bước biểu diễn là 1/16 và phạm vi là -8 đến 7.9375. Theo hợp đồng này, 0x18 biểu diễn 1.5 thay vì số nguyên 24. Nếu diễn giải cùng 0x18 với F=3 thì giá trị là 3. Nối được dây không bảo đảm ý nghĩa số học khớp nhau, nên phải ghi rõ hệ số tỉ lệ của từng cổng.

Trước khi cộng phải căn cùng vị trí dấu chấm. Nếu hai giá trị khác F, có thể mở rộng đủ phía có F nhỏ hơn rồi dịch trái, hoặc giảm F lớn hơn theo chế độ làm tròn đã quy định. Để cộng chính xác hai số cùng W,F cần W+1 bit và giữ nguyên F. Với phép nhân, nhân hai số nguyên raw và cộng số bit phần lẻ.

P=XAXB,FP=FA+FBP=X_A X_B,\qquad F_P=F_A+F_B

Tích đầy đủ của hai số 8 bit F=4 là số signed 16 bit F=8. Để xuất lại thành 8 bit F=4, phải giảm 4 bit phần lẻ rồi kiểm tra phạm vi signed 8 bit. Nếu cắt tích còn 8 bit trước, mạch bão hòa phía sau không còn biết độ lớn ban đầu.

Phân biệt làm tròn xuống và làm tròn gần nhất

Dịch phải số học để bỏ d bit cho q=⌊P/2d⌋q=\lfloor P/2^d\rfloor. Số âm cũng được làm tròn xuống. Ví dụ P=−24,d=4P=-24,d=4 có thương chính xác -1.5 nhưng q=-2. Điều này khác với làm tròn về 0. Không được giả định cách “chỉ chọn các bit cao” có cùng đặc tính sai số cho số âm như với số dương.

Ta thiết kế làm tròn đến giá trị gần nhất, và nếu đúng giữa hai số nguyên thì chọn số chẵn: round-to-nearest, ties-to-even. Gọi bit cao nhất trong phần bị bỏ là guard g, phép OR các bit còn lại là sticky t, và bit thấp nhất của q được giữ là l.

inc=g∧(t∨l),qrnd=q+inc\mathrm{inc}=g\land(t\lor l),\qquad q_{\mathrm{rnd}}=q+\mathrm{inc}

Khi g=0, phần dư nhỏ hơn một nửa nên giữ nguyên. Khi g=1,t=1, phần dư lớn hơn một nửa nên tăng lên. Khi g=1,t=0, giá trị đúng ở giữa nên chỉ cộng 1 nếu q lẻ. Số âm dùng cùng quy tắc, vì với thương làm tròn xuống q và phần dư r=P−q2dr=P-q2^d, luôn có 0≤r<2d0\le r<2^d.

Ví dụ -24 chia 16 bằng -1.5: q=-2 chẵn nên kết quả là -2. Với -40 chia 16 bằng -2.5: q=-3 lẻ nên kết quả là -2. Một quy tắc riêng như “số âm luôn trừ 1” sẽ gây sai. Nếu không bão hòa, sai số số học cuối cùng không vượt nửa LSBLSB Bit có trọng số nhỏ nhất. Cần kiểm tra cả hướng ký hiệu và quy tắc chỉ mục. Tìm hiểu thêm đầu ra. Ties-to-even không bảo đảm sai số trung bình bằng 0 cho mọi phân bố đầu vào, nhưng giảm thiên lệch do luôn làm tròn các trường hợp ở giữa về cùng một phía.

Chuyển raw P=2040 từ 16 bit F=8 sang 8 bit F=4. Giá trị 127.5 được làm tròn thành số chẵn 128, sau đó giới hạn về giá trị signed 8 bit lớn nhất là 127. Phải giữ độ rộng lớn cho đến lần lưu cuối.

Làm tròn trước, bão hòa sau
  1. Đầu vào P=2040: 16 bit · F=8
  2. Giảm hệ số tỉ lệ: 2040 / 16 = 127.5
  3. ties-to-even: Raw sau làm tròn = 128
  4. Bão hòa rồi lưu: raw 127 → 7.9375

Bão hòa sau khi hoàn tất làm tròn

Bão hòa giới hạn giá trị lớn hơn cực đại về cực đại, và nhỏ hơn cực tiểu về cực tiểu. Khác với wrap, số dương lớn không bị đảo thành âm. Tuy nhiên, không thể áp dụng bão hòa chính xác cho giá trị đã bị thu hẹp và wrap.

Dưới đây là mô-đun tổ hợp hoàn chỉnh chuyển giá trị signed 16 bit F=8 thành signed 8 bit F=4. Vì cố định d=4, guard là p[3] và sticky là p[2:0]. Phép tăng khi làm tròn và so sánh phạm vi được thực hiện trong miền signed 17 bit; chỉ lấy 8 bit ở bước cuối.

SystemVerilog
module requantize (
  input  logic signed [15:0] p,
  output logic signed [7:0] y,
  output logic saturated
);
  logic signed [16:0] wide, q, rounded;
  logic inc;
  always_comb begin
    wide = {p[15], p};
    q = wide >>> 4;
    inc = p[3] & ((|p[2:0]) | q[0]);
    rounded = q + (inc ? 17'sd1 : 17'sd0);
    saturated = 1'b0;
    if (rounded > 17'sd127) begin
      y = 8'sh7f;
      saturated = 1'b1;
    end else if (rounded < -17'sd128) begin
      y = 8'sh80;
      saturated = 1'b1;
    end else begin
      y = rounded[7:0];
    end
  end
endmodule

Với P=2040, P/16=127.5 được làm tròn thành số chẵn 128 rồi bão hòa về 127. Giá trị cuối là 7.9375. Nếu chỉ kiểm q=127 trước làm tròn, mạch sẽ bỏ sót việc vượt phạm vi này. saturated cho biết giá trị đã vượt phạm vi và bị giới hạn, không chỉ cho biết đã mất một số bit phần lẻ thấp.

Khi khái quát thành mô-đun tham số, phải xử lý riêng d=0 vì không có bit để bỏ, và d=1 vì không có vùng sticky. Chỉ giấu một part-select ngoài phạm vi trong câu điều kiện có thể vẫn không khắc phục được lỗi elaboration.

Làm tròn và bão hòa làm tăng chi phí cùng độ trễ của bộ cộng, bộ so sánh và MUXBộ chọn kênh Mạch tổ hợp nối một trong nhiều đầu vào tới đầu ra theo tín hiệu chọn. Phải quy định quan hệ giữa bit chọn và số đầu vào. Tìm hiểu thêm; hai chính sách này được chọn riêng. Tài liệu định dạng dấu chấm cố định của AMD cũng phân biệt như vậy. Khi tích lũy nhiều số hạng, hãy quyết định trước có giữ độ rộng trung gian rồi chỉ chuyển đổi một lần ở cuối hay không. Bão hòa ở mỗi bước có thể phá tính kết hợp của phép cộng; làm tròn ở mỗi bước có thể khiến sai số nhỏ tích lũy nhiều lần.

Tự thử

Chuyển đầu vào P signed 16 bit F=8 thành signed 8 bit F=4. Với P lần lượt là 24,40,−24,−40,2040, hãy tính thương làm tròn xuống q, guard/sticky, số nguyên sau làm tròn, raw đầu ra cuối cùng và giá trị thực. Điều gì xảy ra nếu kiểm bão hòa trước ở trường hợp 2040?

Đọc giải thích

Bốn bit thấp của mọi đầu vào đều là 1000, nên guard=1,sticky=0. Với P=24: q=1 (lẻ)→2, raw=2, giá trị thực=0.125. Với P=40: q=2 (chẵn)→2, raw=2, giá trị thực=0.125. Với P=−24: q=−2 (chẵn)→−2, raw=−2, giá trị thực=−0.125. Với P=−40: q=−3 (lẻ)→−2, raw=−2, giá trị thực=−0.125. Với P=2040: q=127 (lẻ)→128, vượt cực đại signed 8 bit nên raw=127, giá trị thực=7.9375, saturated=1. Nếu kiểm riêng q=127 trước rồi cộng 1 trong 8 bit, giá trị có thể wrap thành 0x80 và xuất −8. Phải hoàn tất phép tăng và so sánh trong giá trị signed đủ rộng.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.