Tại sao biểu thức exp (i * pi) trả về kết quả sai trong GNU Octave?


8

Tôi bắt đầu học GNU Octave ngày hôm nay và thử biểu thức đầu tiên được đưa ra trong hướng dẫn

exp(i*pi)

Kết quả là

ans = -1.0000e+000 + 1.2246e-016i

Và có vẻ như Thư viện Khoa học GNU cũng cho kết quả tương tự.

Vì vậy, đây có phải là một lỗi Octave, hoặc các vấn đề chung của phần mềm phân tích số (phần mềm đánh giá biểu tượng chắc chắn sẽ đưa ra câu trả lời chính xác)?


2
Có vẻ quãng tám là nguyên thủy dành cho phân tích số. Mathematica chắc chắn sẽ cung cấp cho bạn một câu trả lời tốt hơn ...: P chỉ nói đùa ... Hãy thử tìm kiếm một giải pháp phân tích biểu tượng GNU
gd1

@Giacomo: Tôi biết điều đó. Tôi chỉ tự hỏi nếu tất cả các phần mềm phân tích số đánh giá đến số đó, hoặc chỉ GNU Octave.
Siyuan Ren

@Karsus Ren đây thực sự không phải là lỗi phần mềm, mà là lỗi phần cứng. Đó là một hạn chế cố hữu của việc cố gắng đánh giá các biểu thức với các số vô tỷ trên phần cứng với số lượng lưu trữ giới hạn cho một số.
Đột phá

Câu trả lời:


8

Đây cũng không phải là một lỗi, nhưng do cách máy tính thực hiện các thao tác dấu phẩy động. Có một số lượng chính xác hạn chế mà bất kỳ máy tính nào cũng có thể hoạt động, và vì vậy đôi khi bạn sẽ thấy sự bất thường như thế này. Mặc dù có thể viết phần mềm có thể xử lý việc này, nhưng nó sẽ tốn nhiều thời gian tính toán hơn và làm tăng đáng kể yêu cầu bộ nhớ.

Nếu bạn nhìn vào nó, e ^ (i * pi) trả về -1 + 1,2x10 ^ -16i. Như bạn có thể thấy, thành phần tưởng tượng là cực kỳ nhỏ (hầu hết sẽ coi nó không đáng kể, vì nó nhỏ hơn 16 bậc so với phần thực). Thành phần này được giới thiệu bằng cách làm tròn và sai số chính xác, cả với tính toán, cũng như giá trị được lưu trữ của pi vì nó không hợp lý (xem liên kết này để biết ví dụ khác xử lý các số vô tỷ).

Nếu lỗi tính toán này không được chấp nhận, bạn nên xem xét các gói toán thực hiện phân tích tượng trưng thay vì phân tích số hoặc sử dụng các số dấu phẩy động có độ chính xác cao . Nhắc nhở của những điều này là chúng sẽ làm tăng đáng kể yêu cầu bộ nhớ của bạn và phân tích biểu tượng thường chậm hơn nhiều. Ngoài ra, các số chính xác cao hơn sẽ chỉ thu nhỏ độ lớn của các lỗi làm tròn / độ chính xác, không loại bỏ chúng.


1
Tôi chỉ cần một xác nhận rằng đây là hành vi phổ biến của phần mềm phân tích số.
Siyuan Ren

@Karsus Ren thực sự là hành vi của loại phần mềm này với độ chính xác đủ cao . Tôi biết rằng dường như phản trực giác, nhưng số chính xác thấp hơn không thường xuyên trả lại những bất thường này. Xem bài viết này của Microsoft để biết thêm chi tiết, nhưng hãy nhớ rằng, vấn đề này là sự kết hợp của cả mã nguồn và kiến ​​trúc trình biên dịch / đích. Ngoài ra, bài viết Wikipedia này có một số thông tin cơ bản tốt về vấn đề này.
Đột phá

1
Vấn đề cơ bản là hằng số của Octave pikhông phải là hằng số toán học π, mà là một xấp xỉ điểm gần đúng với nó. Các expchức năng bổ sung thêm một lỗi nhỏ đó. Một hệ thống hoạt động với các biểu thức tượng trưng có thể tính toán exp(i*pi)chính xác; Octave không phải là một hệ thống như vậy.
Keith Thompson
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.