1.4.2 Số dấu phẩy động (2)

Hãy xem quy ước được sử dụng để biểu diễn một số rất nhỏ (giá trị tuyệt đối xấp xỉ 0).

Một hằng số vật lý gọi là hằng số Planck (ký hiệu là h), theo sách giáo khoa, có giá trị là

6.62607 · 10-34

Nếu bạn muốn sử dụng nó trong chương trình thì bạn sẽ viết nó theo cách này:

6.62607E-34

Dễ vê lờ phải không nào ?

Hãy quay trở lại với giá trị dấu phẩy động. Chúng ta đã biết biến là gì, và chúng ta cũng đã biết cách khai báo một biến số nguyên, bây giờ là lúc khai báo một biến kiểu dấu phẩy động. Chúng ta làm việc này sử dụng từ khóa float. Ví dụ, chúng ta khai báo 2 biến dấy phẩy động tên là PI và Field →

float PI, Field;

Như bạn thấy, sự khác nhau khi khai báo biến số nguyên và số dấu phẩy động là rất nhỏ nếu xem xét từ phương diện cú pháp (chỉ thay int bằng float). Sự khác nhau về mặt ngữ nghĩa mới là quan trọng, bạn có thể thấy trong ví dụ sau →

int i;

float x;

i = 10 / 4;

x = 10.0 / 4.0;

Bạn có thể khá ngạc nhiên khi biết rằng giá trị được đưa vào biến i là 2 (vâng – chỉ là 2 thôi!) trong khi biến x sẽ bằng 2.5. Nhìn vào ví dụ này một cách cẩn thận, bởi vì nó minh họa sự khác biệt quan trọng giữa 2 kiểu dữ liệu.

Chuyện gì sẽ xảy ra khi chúng ta chuyển đổi giá trị integer sang float values hoặc ngược lại ? Chúng ta luôn có thể chuyển đổi từ int sang float, nhưng nó có thể dẫn tới việc mất độ chính xác.

Hãy xem xét ví dụ tiếp theo →

int i;

float f;

i = 100;

f = i;

Giá trị của biến f là 100.0, bởi vì giá trị của kiểu int (100) được tự động chuyển đổi sang float (100.0). Sự chuyển đổi này ảnh hưởng đến biểu diễn nội bộ của những giá trị này vì máy tính sử dụng những phương pháp khác nhau để lưu giá trị float và int trong bộ nhớ của nó.

Bây giờ hãy xem xét tính huống ngược lại.

int i;

float f;

f = 100.25;

i = f;

Sự chuyển đổi này sẽ làm mất độ chính xác – giá trị của i sẽ là 100.

0.25 không có ý nghĩa trong thế giới của những số nguyên. Hơn nữa, chuyển đổi một số float sang int không phải lúc nào cũng khả thi.

Biến int hay float đều có sức chứa giới hạn. Chúng không thể chứa một số lớn tùy ý được.

Ví du, nếu máy tính sử dụng 4 bytes (32 bits) để lưu giá trị int thì giá trị int chỉ có thể nằm trong khoảng từ -2147483648 đến 2147483647.

Biến i trong ví dụ trên không thể lưu giá trị nằm ngoài khoảng -2147483648 đến 2147483647, nếu chúng ta cố tình gán thì không biết chính xác chuyện gì sẽ xảy ra. Chắc chắn sẽ xảy ra mất độ chính xác nhưng gái trị thực sự được gán cho biến i thì không biết trước được. Trong một số hệ thống thì nó có thể là số int lớn nhất cho phép, trong khi ở hệ thống khác thì xuất hiện lỗi, và ở hệ thống khác nữa thì sẽ là một giá trị bất kỳ trong khoảng cho phép. Cái này gọi là implementation dependent (tức là kết quả sẽ phụ thuộc vào vào từng môi trường cụ thể: compiler, CPU, … ). Sau đây là một ví dụ sẽ dẫn tới implementation dependent

int i;

float f;

f = 1E10;

i = f;