2010-09-19 23 views
5

Tất cả các hàm toán học trong JavaScript đều sử dụng radian thay cho độ. Tuy nhiên, chúng là bất bình đẳng, hoặc tôi là cách rời khỏi cơ sở.cos độ không khớp với cos của radian tương đương

Việc quy đổi từ độ sang một radian là:

var rad = angle * Math.PI/180 

Một góc 90 độ equals 1,57079633 radian

Các cosin của một góc 90 độ equals 0.
Các cosin của một 1,57079633 radian equals -3.20510345 × 10-9.

Lưu ý rằng trong Javascript, tất cả mọi thứ được thực hiện trong một bước để tránh các lỗi làm tròn:

var cos = Math.cos(angle * Math.PI/180); 

Tôi rõ ràng là thiếu một cái gì đó rõ ràng ở đây, nhưng cậu bé là nó điều chỉnh các mã.

Trả lời

11

tất cả mọi thứ được thực hiện trong một bước để tránh các lỗi làm tròn

như thế nào mà tránh các lỗi làm tròn? Nó chỉ có nghĩa là các lỗi làm tròn không có sẵn trong một biến riêng biệt, đó là tất cả.

Giá trị đúng của pi không thể được biểu diễn chính xác dưới dạng số dấu phẩy động, vì vậy giá trị thực của pi/2 cũng không thể. Vì vậy, bạn không thể cung cấp cho Math.cos giá trị chính xác cần thiết để có được 0. Nhưng hey - 10 -9 là số rất, rất nhỏ. Điều đó có nghĩa là nếu bạn vẽ một đường dài 10.000 cây số, bạn sẽ kết thúc cách xa trục 1 cm.

Đây chính là loại điều bạn nên mong đợi khi xử lý các số dấu phẩy động. Không so sánh với bình đẳng - so sánh trong một số dung sai.

+0

218k !? Đã không được chú ý, lần cuối cùng tôi nhìn thấy bạn bạn đang trên 10k! –

+2

Đây là câu hỏi đầu tiên của tôi mà Jon Skeet coi là xứng đáng với câu trả lời. – SamGoody

+0

Dung sai mà Jon đề cập thường được gọi là epsilon trong các giấy tờ chính thức –

1

Sẽ luôn có lỗi làm tròn. Và điểm nổi không phải là toán học chính xác, nó chỉ chính xác với một số lượng chữ số đáng kể.

Thay đổi mã của bạn để mã không "hỏng" khi bạn gặp lỗi theo thứ tự 1/1000000000.

1

Đối với hầu hết chúng ta thực hiện các khoản tiền nghiêm trọng trên máy tính 0 IS bằng -3.20510345 × 10^-9 với bất kỳ mức độ chính xác nào mà bạn có quyền mong đợi khi làm việc với số dấu phẩy động. Đây là một chủ đề được đề cập thường xuyên trên SO.

-3

Tôi chỉ nhận ra:

-3,20510345 × 10-9 là giống như -0,00000000320510345, mà là rất gần bằng không.

Chuyển đổi của Google thành radian được làm tròn và làm tròn làm cho lỗi này bị lỗi.

Tôi đoán là Javascript, vốn nổi tiếng vì thiếu độ chính xác với số, cũng tạo ra một radian không chính xác, và do đó cosign của nó là tắt.

Không chắc chắn làm thế nào tôi sẽ giải quyết điều này mặc dù - làm tròn là không thể chấp nhận được, vì điều đó sẽ không làm việc cho các góc độ khác.

+2

Tôi không nghĩ JS là bất kỳ "khét tiếng vì thiếu độ chính xác với số" hơn bất kỳ thứ gì khác sử dụng số học dấu phẩy động. Ngoài ra nó sẽ là tốt hơn nếu bạn thêm này như là một chỉnh sửa cho câu hỏi của bạn thay vì gửi nó như là một câu trả lời. –

+0

Khi tôi bắt đầu viết câu trả lời, không có câu trả lời nào khác. Và nó trả lời câu hỏi - nếu tôi đã thêm nó như là một chỉnh sửa, mọi người sẽ phàn nàn rằng không có câu hỏi hợp lệ. – SamGoody

1

Vâng, bạn chỉ đang mất dữ liệu về chuyển đổi loại tại đây.

90 biến dạng theo radian không bằng 1,57079633 chính xác. Nếu có nhiều chữ số thập phân hơn, điều đó sẽ chuyển đổi thẳng trở lại như mong đợi.

Bạn sẽ luôn phải cẩn thận với những thứ như thế này. Như đã đề cập ở trên, 10^-9 đủ gần bằng không.

Cũng lấy từ MSDN:

Bên cạnh đó, kết quả của số học và phân công các hoạt động với các giá trị đúp thể khác nhau đôi chút bởi nền tảng vì sự mất độ chính xác của các loại đúp. Ví dụ, kết quả của việc gán một giá trị Đôi bằng chữ có thể khác nhau trong các phiên bản 32-bit và 64-bit của Khuôn khổ .NET. Ví dụ sau minh họa sự khác biệt này khi giá trị chữ -4.42330604244772E-305 và một biến có giá trị là -4.42330604244772E-305 được gán cho một Biến kép. Lưu ý rằng kết quả của phương thức Parse (String) trong trường hợp này không bị mất độ chính xác.

0

Trong máy tính, π/2 radians không thể chính xác bằng 90 độ, vì π là số vô hạn. Vì vậy, người ta không thể mong đợi presicion hoàn hảo với π, trừ khi máy tính là ∞-bit.

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