Ai đó có thể giải thích cho tôi cách tôi chuyển đổi giá trị dấu phẩy động 32 bit sang giá trị dấu phẩy động 16 bit không?Float32 to Float16
(s = dấu hiệu e = số mũ và m = mantissa)
Nếu 32-bit float là 1s7e24m
Và 16-bit float là 1s5e10m
Sau đó là nó đơn giản như đang làm gì?
int fltInt32;
short fltInt16;
memcpy(&fltInt32, &flt, sizeof(float));
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Tôi giả định nó KHÔNG đơn giản như vậy ... để bất cứ ai có thể cho tôi biết bạn cần làm gì?
Chỉnh sửa: Tôi cam thấy tôi đã thay đổi số mũ sai của mình ... vì vậy điều này có tốt hơn không?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Tôi hy vọng điều này là chính xác. Xin lỗi nếu tôi thiếu một cái gì đó hiển nhiên đã được nói. Gần nửa đêm của nó vào một đêm thứ sáu ... vì vậy tôi không "hoàn toàn" tỉnh táo;)
Chỉnh sửa 2: Rất tiếc. Buggered nó một lần nữa. Tôi muốn mất 3 bit hàng đầu chứ không phải thấp hơn! Vậy làm thế nào về điều này:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
mã cuối cùng nên:
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Tôi nghĩ rằng điều này đã được yêu cầu (và được trả lời) tại đây: http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion – humbagumba
nó có thể đơn giản, nhưng bạn mất độ chính xác trừ phi float32 không sử dụng tất cả "độ chính xác" mà nó có ... về cơ bản, bạn nhận được 5/7 số bit của điểm kinh nghiệm (bạn dĩ nhiên là những cái có ý nghĩa nhất), và 10/24 của mantissa; các tỷ lệ này nói một cách nào đó bạn có thể mất bao nhiêu trong chuyển đổi. chính xác như nó xảy ra nếu bạn muốn phù hợp với 32 bit số nguyên thành một số nguyên 16bits ... phạm vi số rappresentable nhỏ hơn; "cắt" mantissa làm giảm "độ chính xác", và số mũ cũng giới hạn phạm vi: 5 bit đã ký cho -16 đến +15, so với -64/+ 63 (nếu tôi đã làm đúng ...: D muộn nó là) – ShinTakezou
@ShinTakezou: Chắc chắn không thể mất 16 bit dữ liệu và KHÔNG mất độ chính xác ?? Float16 là ít chính xác hơn và do đó tự động có độ chính xác ít hơn ... hoặc tôi hiểu lầm bạn? – Goz