3 khao sat so dau cham dong

3 3 0
3   khao sat so dau cham dong

Đang tải... (xem toàn văn)

Thông tin tài liệu

Bài thực hành số 1 Hướng dẫn thực hành môn KTMT Khảo sát số chấm động Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp HCM 1 Khảo sát số chấm động của các ngôn ngữ lập trình trên nền kiến trúc x86 Mục đíc[.]

Hướng dẫn thực hành môn KTMT Khảo sát số chấm động Khảo sát số chấm động ngôn ngữ lập trình kiến trúc x86 Mục đích   Tìm hiểu số chấm động ngơn ngữ lập trình kiến trúc x86 Hiểu rõ cách tổ chức số chấm động Tóm tắt lý thuyết Hầu hết ngơn ngữ lập trình kiến trúc x86 Assembly, C/C++, Java, VB, C#,… sử dụng chuẩn số chấm động IEEE 754 để biểu diễn số chấm động Trong đó, chuẩn số chấm động 32-bit (single – xác đơn) chuẩn 64-bit (double – xác kép) sử dụng phổ biến Ví dụ ngơn ngữ C, kiểu float sử dụng số chấm động 32-bit, kiểu double sử dụng số chấm động 64-bit Bài tập Bài Viết chương trình nhập vào số chấm động Hãy xuất biểu diễn nhị phân thành phần (dấu, phần mũ, phần trị) số chấm động vừa nhập Ví dụ: Nhập vào số chấm động (32-bit): Biểu diễn nhị phân tương ứng: 10000001 10000000000000000000000 Nhập vào số chấm động (32-bit): -12.625 Biểu diễn nhị phân tương ứng: 10000010 10010100000000000000000 Nhập vào số chấm động (32-bit): 0.1015625 Biểu diễn nhị phân tương ứng: 01111011 10100000000000000000000 Nhập vào số chấm động (32-bit): 0.1 Biểu diễn nhị phân tương ứng: 01111011 10011001100110011001101 Nhập vào số chấm động (32-bit): Biểu diễn nhị phân tương ứng: 00000000 00000000000000000000000 Hướng dẫn: - Viết hàm dumpFloat(float *p) ngôn ngữ C++ cho phép xem bit biến kiểu float o Ví dụ chương trình có khai báo biến float x gọi dumpFloat(&x) in hình biểu diễn nhị phân giá trị lưu x, rõ phần exponent, phần significand o Lưu ý: nên dùng phép toán bit để lấy nội dung bi in không thực việc chuyển đổi thủ công Bài Viết chương trình nhập vào biểu diễn nhị phân số chấm động Hãy xuất biểu diễn thập phân tương ứng Ví dụ: Dãy nhị phân: 10001000 01101100001000000000000 Số chấm động (single) tương ứng: 728.25 Dãy nhị phân: 01000110 01101011000000000000000 Số chấm động (single) tương ứng: -9.83913471531 × 10-18 Dãy nhị phân: 01111011 10011001100110011001101 Số chấm động (single) tương ứng: 0.1 Dãy nhị phân: 11111111 00000000000000000000000 Số chấm động (single) tương ứng: + Dãy nhị phân: 11111111 10000000000000000000000 Số chấm động (single) tương ứng: NaN Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -1- Hướng dẫn thực hành môn KTMT Khảo sát số chấm động Hướng dẫn: - Viết hàm forceFloat(float *p, char *s) ngôn ngữ C++ cho phép ghi bit cào vùng nhớ kiểu float o Ví dụ chương trình có khai báo biến float x gọi forceFloat(&x, “10011”), bit cao (LSB) vùng nhớ 32 bit chiếm x bị ghi giá trị 1,0,0,1,1 bit lại gán giá trị Giả định chuỗi s chứa ký tự có độ dài khơng q 32 Bài 3: Dùng hàm viết để khảo sát câu hỏi: - 1.3E+20 có biểu diễn nhị phân - Số float nhỏ lớn số nào? Biểu diễn nhị phân nó? - Những trường hợp tạo số đặc biệt (kiểu float) (viết chương trình thử nghiệm giải thích kết quả): o Số vô (inf) o Số báo lỗi NaN o Ví dụ: X – (+), (+) – (+), X/0, 0/0, /, sqrt(X) với X int -> float.Kết ban đầu ? Chuyển đổi int -> float -> int Kết ban đầu ? Phép cộng số chấm động có tính kết hợp ? (x+y)+z = x+(y+z) Với i biến kiểu int, f biến kiểu float i = (int) (3.14159 * f); f = f + (float) i; if (i == (int)((float) i)) { printf(“true”); } if (i == (int)((double) i)) { printf(“true”); } if (f == (float)((int) f)) { printf(“true”); } if (f == (double)((int) f)) { printf(“true”); } Hướng dẫn thuật toán Cách 1: Thực theo thuật toán Thuật toán: chuyển từ giá trị số chấm động sang biểu nhị phân Ví dụ: chuyển -12.625 sang biểu diễn nhị phân Chuyển phần trị sang dạng nhị phân a Phần nguyên: theo thuật toán chuyển từ số thập phân sang nhị phân 1210 = 11002 b Phần thập phân: Lặp lại việc nhân phần thập phân với phần thập phân (hoặc đủ số bit phần trị) Tại bước nhân, phát sinh bit tùy thuộc vào phần nguyên kết phép nhân 0.625  = 1.25  0.25  = 0.5  0.5  = 1.0  Như vậy, biểu diễn nhị phân phần trị: 1100.101 Chuẩn hóa 1100.101 = 1.100101  23 Điền bit vào trường theo chuẩn:  Dấu: số âm nên bit dấu S=1  Phần mũ: cộng phần mũ (tìm sau bước chuẩn hóa) với phần bias (2k-1-1) Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -2- Hướng dẫn thực hành môn KTMT Khảo sát số chấm động 8-1 E = 310 + 12710 = 13010 = 100000102 (với bias = -1 = 127)  Phần trị: thêm bit vào bên phải cho đủ số bit phần trị M = 10010100000000000000000 Như vậy, biểu diễn nhị phân số chấm động -12.625 10000010 10010100000000000000000 Thuật toán: chuyển từ biểu diễn nhị phân số chấm động sang biểu diễn thập phân Ví dụ: chuyển dãy bit 01000100001101100001000000000000 sang biểu diễn thập phân Chia thành thành thành phần S =0 E = 10001000 M = 01101100001000000000000 Tính phần mũ: đổi dãy nhị phân thành số thập phân trừ cho bias (2k-1-1) E = 100010002 = 13610 = 136-127 = Tính phần trị: phục hồi bit phần nguyên loại bỏ bit thừa cuối M = 1.01101100001 Kết hơp phần trị với phần mũ: 1.01101100001  29 = 1011011000.01 Nếu trị tuyệt đối phần mũ lớn, kết hợp với phần trị trên, thực tính giá trị phần mũ nhân với phần trị cho kết gần Chuyển dãy nhị phân thành giá trị số chấm động tương ứng Lũy thừa 29 28 27 26 25 24 23 22 21 20 2-1 2-2 Giá trị tương ứng 512 256 128 64 32 16 0.5 0.25 Bits 1 1 0 Giá trị tính 512 + 128 + 64 + 16 + + 0.25 = 728.25 Thêm dấu: S = nên số dương Như vậy, giá trị thập phân tương ứng với dãy bit 01000100001101100001000000000000 728.25 Cách 2: Dựa vào chất lưu trữ nhị phân, dễ dàng xuất dạng biểu diễn nhị phân số chấm động hay chuyển dãy bit biểu diễn thành giá trị lưu trữ tương ứng dựa vào thao tác luận lý AND, OR, SHIFT LEFT, SHIFT RIGHT,… Chú ý: Không thể thực thao tác luận lý trực tiếp số thực float x; x >> 1;  báo lỗi Nên, cần lấy trỏ tới vùng nhớ chứa số thực Nhưng… long *p = &x;  báo lỗi Do đó, cần thực ép kiểu sau: long *p = (long *)&x; Và thực thao tác luận lý: *p >> 1; Mở rộng Mô số phép toán số chấm động: cộng, trừ, nhân, chia Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -3-

Ngày đăng: 08/04/2023, 06:22

Tài liệu cùng người dùng

Tài liệu liên quan