2017-08-22 33 views
8

Làm việc trên con đường của tôi để giải quyết bài tập 2.1 từ "Ngôn ngữ lập trình C", nơi người ta nên tính toán trên máy địa phương phạm vi của các loại khác nhau như char, ngắn, int vv nhưng cũng nổi và đôi. Bởi tất cả mọi thứ ngoại trừ nổi và đôi tôi xem cho tràn để xảy ra và do đó có thể tính toán các giá trị tối đa/phút. Tuy nhiên, bằng cách nổi này vẫn không hoạt động.Làm thế nào để tràn một phao?

Vì vậy, câu hỏi đặt ra là tại sao mã này in cùng một giá trị hai lần? Tôi nghĩ dòng thứ hai nên in inf

float f = 1.0; 
printf("%f\n",FLT_MAX); 
printf("%f\n",FLT_MAX + f); 
+0

thêm thông số định dạng 'e', số sẽ được thể hiện dưới dạng số mũ. – 0decimal0

+0

Xem câu hỏi này: https://stackoverflow.com/questions/6910115/how-to-represent-float-number-in-memory-in-c Có thể nó làm cho một số điều rõ ràng hơn cho bạn ... –

+0

https://stackoverflow.com/a/1460431/6935629 – rsp

Trả lời

5

Thử nhân với 10 và nếu sẽ tràn. Lý do nó không tràn là cùng một lý do tại sao thêm một phao nhỏ vào một float rất lớn không thực sự thay đổi giá trị chút nào - đó là một định dạng dấu chấm động, có nghĩa là số chữ số chính xác bị giới hạn.

Hoặc, thêm ít nhất đó chữ số đáng kể cuối cùng có khả năng sẽ làm việc:

float f = 3.402823e38f; // FLT_MAX 
f = f + 0.000001e38f; // this should result in overflow 
+0

thử nghiệm và lỗi dẫn đến đây là hoạt động nhỏ nhất để làm cho nó tràn: 'printf ("% f \ n ", FLT_MAX * 1,00000006f);' (ít nhất là trên thiết lập của tôi) –

+1

xác nhận bổ sung với '0.000001e38f' hoạt động như tốt –

2

Lý do tại sao nó in cùng một giá trị gấp đôi là 1.0 là quá nhỏ để có thể bổ sung vào FLOAT_MAX. A float thường có 24 bit cho phần định trị và 8 bit cho số mũ. Nếu bạn có một giá trị rất lớn với một số mũ là 127, bạn sẽ cần một mantissa với ít nhất 127 bit để có thể thêm 1.0.

Ví dụ: cùng một vấn đề tồn tại với giá trị số mũ thập phân (và bất kỳ khác): Nếu bạn có số có 3 chữ số có nghĩa như 1.00 * 10 , bạn không thể thêm 1 vào nó vì điều này sẽ là 1'000'001 và điều này yêu cầu 6 chữ số có nghĩa.

Bạn có thể trànbằng cách tăng gấp đôi giá trị nhiều lần.

Các vấn đề liên quan