01/10/2018, 17:31

Hỏi về union trong code C

Mình không phải lập trình viên C code, nhưng cần convert 1 số đoạn c code. Nhưng không hiểu đoạn mã bên dưới. Nó là hàm nhập vào giá trị p và tính gần đúng 2^p .ví dụ 2^3 = 8.000244

Mình đã đọc định nghĩa union và hiểu được nó là kiểu dữ liệu tự định nghĩa và cho phép chứa nhiều kiểu dữ liệu khác nhau, khá giống struct nhưng khác ở chỗ struct lưu trữ dữ liệu trên nhiều vùng nhớ còn union chỉ lưu trữ dữ liệu trên 1 vùng nhớ.

Như vậy biến union var bên dưới có sizeof = 4 chứa 2 kiểu dữ liệu unsigned int và float.

Giả sử mình chạy fastpow2(3.0) thì mình không hiểu var.f lấy dữ liệu kiểu gì , cách nào mà nó ra được 8.000244

float fastpow2 (float p)
{
  float offset = (p < 0) ? 1.0f : 0.0f;
  float clipp = (p < -126) ? -126.0f : p;
  int w = clipp;
  float z = clipp - (int)clipp + offset;
  union { unsigned int i; float f; } var = { (unsigned int) ( (1 << 23) * (clipp + 121.2740838f + 27.7280233f / (4.84252568f - z) - 1.49012907f * z) ) };

  return var.f;
}
Tao Không Ngu. viết 19:39 ngày 01/10/2018

Hi terrypaton.
Cái này là một skill thao tác với bit trong C/C++. Hiểu đại khái là 1 vung nhớ có thể đọc như một biến kiểu float hoặc usigned (cùng kích thước 2 byte)

rogp10 viết 19:34 ngày 01/10/2018

Thực ra 1 slot 4 byte có thể đọc như một số nguyên int, nhưng cũng có thể đọc ra một float. Vẫn là 4 byte đó thôi

Lúc khởi tạo tbd sẽ căn cứ vào kiểu dữ liệu để gán vào. Vậy đọc ra là: tính bằng float hết, rồi đưa vào unsigned int và đọc số đó như float.

terrypaton viết 19:43 ngày 01/10/2018

Lúc khởi tạo tbd sẽ căn cứ vào kiểu dữ liệu để gán vào. Vậy đọc ra là: tính bằng float hết, rồi đưa vào unsigned int và đọc số đó như float.

mình hiểu định nghĩa union rồi, đây chính là chổ mình thắc mắc nó đọc như thế nào mà ra được float, cụ thể là ra được 8.000244 trong ví dụ trên. Mình cần hiểu chính xác quá trình đưa unsigned int và đọc số đó bằng float như thế nào

Bài liên quan
0