2010-12-28 27 views
5

Tôi đã C chương trìnhGCC cho câu trả lời không chính xác với tối ưu hóa kích hoạt

double d = 1.4; 
int x; 
x = d * 10; 
printf("\n\n VALUE = %d " ,x); 

sau tôi có gcc 4.3.3 mà đi kèm với Ubuntu 9,04

tôi nhận được câu trả lời như 13 với -O0 nhưng có được câu trả lời đúng tức là 14 với mức tối ưu hóa cao hơn

Đây có phải là sự cố đã biết hoặc có vấn đề gì đó với mã của tôi không?

Trả lời

9

Bạn không thể đại diện cho 1,4 chính xác bằng cách sử dụng double, giá trị thực sự là một chút lagrer hoặc nhỏ hơn một chút (xem this). Vì vậy, không có câu trả lời "đúng" - sử dụng round() thay vì cắt xén một cách vô tình.

4

Ở mức tối ưu cao hơn, GCC có thể tối ưu hóa cả hai biến và tính toán giá trị để in. Không tối ưu hóa, giá trị của d (và do đó giá trị in ấn) sẽ phải tuân theo biểu diễn dấu phẩy động và có thể không chính xác là 1.4. Hãy thử điều này:

double d = 1.4; 
int x; 
x = d * 10; 
printf("Old = %lf, New = %d\n", d, x); 
+0

Hãy thử '% .50f' thay vì'% lf' nếu bạn muốn có thể xem giá trị thực ... –

9

Đây là gcc bug #323, thực tế đây không phải là lỗi mà là chi tiết triển khai.

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