Tại sao Spotlight lại đưa ra một giá trị sai cho `cos (pi / 2)`?


8

Như bạn có thể biết, Spotlight có thể làm toán học đơn giản. Ví dụ, gõ cos(pi)sẽ dẫn đến -1, như bạn có thể mong đợi. Tôi vừa gõ vào cos(pi/2), số 0 nhưng nó đã cho tôi -5e-12.

Vâng, có lẽ là do lỗi làm tròn, nhưng thôi nào : cos(pi/2)! Theo tôi, điều đó rõ ràng trông giống như lỗi. Bạn nghĩ sao?


1
cos (x) là một hàm siêu việt. Trừ khi chúng có giá trị mã hóa cứng cho pi, pi / 2, v.v., bạn sẽ gặp một số lỗi.
Navin

@Navin thực sự tôi mong họ mã hóa các giá trị này vì chúng rất quan trọng.
poitroae

1
pibản thân nó sẽ được mã hóa cứng (khi bạn lấy -1 cho cos(pi)) nhưng ngay khi bạn thao tác với nó, bạn sẽ nhận được một số dấu phẩy động, có độ chính xác hạn chế. OSX không mã cứng pi/2, pi/4v.v., nó thực sự hoạt động.
harryg

2
@harryg Mặc dù có các lỗi làm tròn có thể được giải quyết bằng cách chuyển sang thập phân, nhưng đây không phải là một trong số đó. Thập phân là hữu ích nếu bạn muốn đại diện 0.1chính xác. chính xác, nhưng nó không hữu ích cho các số vô tỷ như pi không thể được biểu diễn chính xác bằng nhị phân hoặc thập phân.
CodeInChaos

1
Để tham khảo, trong Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

Câu trả lời:


13

Đó là do thiếu độ chính xác của pi và do tổng thể thiếu độ chính xác trong hệ thống tích hợp.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


Về độ chính xác của hệ thống tổng thể:

3.141592653589793238462643383 = 3.1415926536 

Trong Python chúng ta có được như sau:

>>> float("3.141592653589793238462643383")
3.141592653589793

Như chúng ta có thể thấy có một vấn đề với độ chính xác vì nó thậm chí không khớp với đại diện float.


Đó là do thiếu độ chính xác, nhưng không thể đổ lỗi cho độ lớn này trên các số dấu phẩy động.
Dennis Jaheruddin

2
Có lẽ thiếu chính xác hơn với giá trị pi.
Matthieu Riegler

5

Họ không lưu trữ π với độ chính xác điểm nổi bất thường. Họ đang sử dụng một giá trị không chính xác cho π với độ chính xác gấp đôi. Để xấp xỉ 3,1415926536 ở dạng nhị phân, cần ít nhất 38 bit:

3.14159265359922… > 11.001001000011111101101010100010001001

Lưu ý rằng 2 ^ -36 là khoảng 1,5e-11, trùng khớp với dấu 99. Điểm nổi chính xác kép có ý nghĩa 52 bit. Để đánh giá cos(pi/2)là -5e-12, sự lựa chọn duy nhất khác có thể là loại 48 bit, sẽ rất lạ.

Gần 0 và π, trong đó đạo hàm gần bằng 0, cos (θ) không thể được tính toán chính xác:

cos(3.1415926536) ≈ -0.999999999999999999999947911

Điều đó khác với -1 khoảng 5,2e-23, nhỏ hơn cho double, do đó, cos(3.1415926536)được tính chính xác là -1 ... không chính xác.

Gần ± π / 2, đạo hàm [ -sin (θ) ] gần bằng 1, do đó, lỗi ở đầu vào trở thành đầu ra.

cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12

Tôi cos(π/2)tình cờ có một máy tính TI hiển thị một chữ số ít hơn và tính là -5.2e-12. Tuy nhiên, nó rất khác nhau về mặt điện tử và được thiết kế để đưa ra một giá trị chính xác cho cos(90°).

Tôi đoán rằng trong Spotlight, cos(pi/2)đang được tính bằng cách truy xuất giá trị cho số π, chuyển đổi thành chuỗi thập phân , lưu trữ dưới dạng giá trị nhị phân (chính xác, hợp lý) 11.00100100001111110110101010001000100100001101101111 (hoặc 10000), sau đó chia cho 2 các giá trị đúng của π / 2. Bạn nên tìm hiểu xem cos(pi/2 + cos(pi/2))có gần với không hơn không (có thể là -2.2e-35).

Phép nhân với lũy thừa của hai chỉ nên ảnh hưởng đến số mũ chứ không ảnh hưởng đến số mũ. Có thể xác định cách làm tròn được áp dụng bằng cách lặp lại gấp đôi hoặc nhân đôi.


Không có gì sai với Markdown - MathJax chỉ được kích hoạt trên các trang web liên quan đến Toán học, không phải toàn SE.
grg

1
cos (pi / 2 + cos (pi / 2)) hiển thị chính xác là 0.
Nick Matteo

4

Đó là một lỗi có thể tái tạo vào ngày 10.9.2 - và một lỗi làm tròn điểm nổi như thế là khá điển hình.

Đó là giá trị của pi đang được xử lý mà không đủ độ chính xác nếu tôi phải đoán.

  • cos (999999 * pi) không có lỗi
  • cos ((999999 + 1) * pi) không có lỗi - có khả năng làm tròn số

Tôi sẽ truy cập https://developer.apple.com/orms-reporting/ nếu bạn muốn thấy bộ máy sửa lỗi của Apple hoạt động.


5
Có phải là một lỗi, thực sự? Điều gì sẽ là độ chính xác trên một hoạt động như vậy?
Édouard

Tôi không phải là một nhà phát triển đã đăng ký, nhưng tôi sẽ rất biết ơn nếu bạn có thể gửi nó cho chúng tôi!
poitroae

4
@ Édouard Bạn có thể coi đó là một lỗi nếu người dùng bị dẫn đến mong đợi một số khả năng cho toán học tượng trưng. Bất kỳ hệ thống đại số máy tính (CAS) tất nhiên sẽ biết rằng cos (π / 2) = 0 chính xác! Mặt khác, hầu như không hợp lý khi hy vọng Spotlight có chứa CAS. Và trong lĩnh vực số học dấu phẩy động, các kết quả như báo cáo của OP sẽ được mong đợi. Bất kỳ báo cáo lỗi có thể được dán nhãn tốt hơn một yêu cầu tính năng, có lẽ.
Harald Hanche-Olsen

1
@ Édouard bmike trên thực tế chính xác rằng đây là một lỗi và không chỉ là lỗi vòng. Độ chính xác dự kiến ​​của một hoạt động như vậy, với số học độ chính xác kép tiêu chuẩn, là khoảng 10 ^ -16, không phải 10 ^ -12. Bạn có thể tự mình thử điều này bằng cách viết một chương trình bằng ngôn ngữ yêu thích của bạn, tận dụng sự hỗ trợ điểm nổi của CPU, thực hiện tính toán và kiểm tra mô hình bit của kết quả. Như bmike nói, lý do có thể là giá trị π mà Spotlight sử dụng không được xác định với độ chính xác đủ.
Szabolcs

2
Một cái gì đó kỳ lạ đang diễn ra ở đây. cos(2*acos(0)*0.5)trả về một số thứ tự 10^-10. Vì vậy, đó không phải là vì hằng số π không đủ chính xác. Tôi không thể giải thích kết quả này: nó quá thiếu chính xác cho độ chính xác kép và quá chính xác cho độ chính xác đơn.
Szabolcs

4

Từ các câu trả lời và nhận xét khác, sau đây trở nên rõ ràng:

Thực tế là bạn nhận được một kết quả khác không phải là một lỗi, ngay cả với việc triển khai hoàn hảo phần mềm, bạn sẽ chạy vào giới hạn của các phép tính dấu phẩy động. Tuy nhiên, lỗi theo thứ tự 10 ^ -12 thực sự lớn.

Điều này KHÔNG đổ lỗi cho sự không chính xác của số dấu phẩy động. Kết quả bạn nhận được chỉ là thế này:

cos(1.5707963268)

Điều đó có thể được xác nhận bằng cách sử dụng bất kỳ gói phần mềm thay thế. Nếu bạn đánh giá cos(pi/2)ở một trong những gói đó, bạn chắc chắn sẽ nhận được kết quả gần với 0 hơn 10 ^ -12.

Để kết luận tôi thấy hai hạn chế có thể xảy ra, một trong số đó phải được áp dụng:

  1. Pi không được lưu trữ với độ chính xác đủ hoặc ít nhất pi / 2 dẫn đến độ chính xác không đủ
  2. Cos chỉ đơn giản là không đủ độ chính xác làm đầu vào

Có lẽ ai đó có acces cho phần mềm có thể xác nhận cái nào trong số này áp dụng.

Cập nhật Như đã đề cập trong bình luận, vấn đề dường như là độ chính xác của hằng số pi.


Điều này thật kỳ lạ. 1.5707963268 là kết quả Spotlight mang lại cho bạn khi bạn tính pi / 2. Sau một vài lần thử đơn giản, có vẻ như Spotlight hiển thị 10 chữ số có nghĩa cho số dưới 1 và 11 cho các số trên 1. Nhưng vì lý do thực hiện kỳ ​​lạ nào, một bước làm tròn sẽ được áp dụng bên trong tính toán thay vì sau?
Édouard

1
Tôi cũng muốn chỉ ra rằng nếu bạn cung cấp cho Spotlight một số xấp xỉ chính xác hơn pi / 2 (bằng cách sao chép hơn 10 chữ số từ Wolfram Alpha, ví dụ), độ chính xác sẽ tăng.
Édouard

Cảm ơn vì đã xác nhận dự đoán của tôi rằng độ chính xác của pi là nguyên nhân gây ra lỗi trong khoảng từ 0 đến khoảng 10 ^ -12 trong câu hỏi của OP.
bmike


2

Xem xét rằng đó -5e-12là một số nhỏ verryyyy, đây một lỗi làm tròn.

Tôi nghĩ đó là hệ quả của ánh đèn sân khấu hiển thị số thập phân nhiều hơn số được sử dụng trong định nghĩa của pihằng số hoặc chuỗi vô hạn được sử dụng để tính các hàm lượng giác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.