Đây là một câu hỏi rất đơn giản, nhưng là một câu hỏi quan trọng vì nó ảnh hưởng rất lớn đến toàn bộ dự án của tôi.Cắt một đôi thành phao trong C
Giả sử tôi có snipet mã sau:
unsigned int x = 0xffffffff;
float f = (float)((double)x * (double)2.328306436538696e-010); // x/2^32
Tôi mong rằng f
có cái gì đó như 0,99999, nhưng thay vào đó, nó vòng lên tới 1, vì nó xấp xỉ gần float
. Điều đó không tốt vì tôi cần float
giá trị trong khoảng [0,1], không phải [0,1]. Tôi chắc chắn nó là một cái gì đó đơn giản, nhưng tôi đánh giá cao một số trợ giúp.
Đây không phải là một câu trả lời hữu ích. Như các câu trả lời khác đã cho thấy (và họ đã chỉ ra cách), có những điều bạn có thể làm. –
@EricPostpischil, nó không hữu ích như thế nào? Nó cung cấp một giải pháp làm việc cho vấn đề, mà không để lại một chế độ làm tròn có hiệu lực mà sẽ thay đổi tất cả các tính toán trung gian và sau đó. –
Tuyên bố “Không có nhiều việc bạn có thể làm” là gây hiểu lầm và không cần thiết ngăn cản. Câu lệnh về các bit trong 'int' và' float' không liên quan; OP không mong đợi một bản đồ chính xác. Họ không yêu cầu tránh làm tròn, chỉ để kiểm soát nó. –