Vấn đề là việc phân chia số nguyên ở phần sâu thẳm nhất của biểu thức, mà truncates giá trị (bỏ qua phần phân đoạn). Một tùy chọn, như đã đề cập, là làm cho mọi hằng số một số dấu chấm động, hoặc bằng cách thêm ".0" hoặc "f" sau nó. Ngoài ra, bạn có thể bỏ qua các dấu ngoặc đơn từ biểu thức bên trong nhất định.Vì M_PI
là một số dấu chấm động, và phép nhân trong C là trái kết hợp (có nghĩa là nó tiến hành từ trái sang phải) phép nhân đầu tiên (2 * M_PI) sẽ được đẩy lên một phao, mỗi lần nhân lên kế tiếp. Vì cos()
trả về một phao, pNumber
sẽ được gán một phao mà không thực hiện bất kỳ phân chia số nguyên nào, do đó không mất chính xác. (Lưu ý: Thường thì không nên dựa vào sự kết hợp của nhà điều hành hoặc ưu tiên, nhưng trong trường hợp này tôi chỉ đang cố gắng chứng minh rằng nó thực sự hoạt động.)
Theo phạm vi số bạn nên thấy , nhớ lại rằng cosin (chưa sửa đổi) dao động từ -1 đến +1, không phải từ 0 đến 1, vì vậy bạn thực sự sẽ thấy -100 đến 100 (theo lý thuyết). Để có phạm vi chính xác, bạn muốn thêm 1, sau đó nhân với 50.
Ngẫu nhiên, lỗi biên dịch bạn nhận được trong trường hợp đầu tiên là do pi
không được xác định. Hướng dẫn sử dụng M_PI
là chính xác - đối với hằng số toán học, nó luôn thông minh hơn (và nhất quán hơn) để sử dụng những gì hệ thống cung cấp. Nếu bạn tò mò, trên Leopard, các hằng số này là #defined trong Math.h, dòng 528-540. Bạn có thể mở tệp bằng cách sử dụng Tệp> Mở nhanh ... (Cmd-Shift-D) và nhập "Math.h" hoặc nhấp đúp vào M_PI
trong mã của bạn trong khi giữ phím Command.
Nguồn
2009-06-11 04:09:00
Đầu tiên, tôi sẽ làm cho các hằng số của tôi nổi. – Nosredna