2009-05-08 25 views
15

Hầu hết các ngôn ngữ lập trình cung cấp 2 làm câu trả lời cho căn bậc hai của 4. Tuy nhiên, có hai câu trả lời: 2-2. Có lý do cụ thể nào, lịch sử hay không, tại sao chỉ có một câu trả lời thường được đưa ra?Tại sao hầu hết các ngôn ngữ lập trình chỉ đưa ra một câu trả lời cho căn bậc hai là 4?

+2

Nếu bạn mở rộng để đối phó với "trả về tất cả các gốc" thì bạn rất nhanh chóng cần một ngôn ngữ có hỗ trợ dựng sẵn cho số phức. –

+0

Và tên của ngôn ngữ đó là gì? – bugmagnet

+0

Tên của một trong những ngôn ngữ đó là tiếng Anh. :) – mbaitoff

Trả lời

37

Bởi vì:

  • Trong toán học, √ x thường, trừ trường hợp quy định, đề cập đến hiệu trưởng (ví dụ tích cực) gốc của x [http://mathworld.wolfram.com/SquareRoot.html].
  • Một số ngôn ngữ không có khả năng trả về nhiều giá trị.
  • Vì bạn chỉ có thể áp dụng phủ định, trả về cả hai sẽ không cần thiết.
+5

Tôi không nghĩ vậy! Trong toán học, giải pháp cho phương trình f (x) = sqrt (x) là x = +/- 2. Nó phụ thuộc hoàn toàn vào tên miền bạn đã chọn (số tự nhiên, số nguyên, số thực, v.v.). Vì các chương trình cho phép số -ve, toán học sẽ ra lệnh rằng chúng trả về cả hai giải pháp. Đó là chủ nghĩa thực dụng giới hạn các ngôn ngữ lập trình (mặc dù Python luôn có thể trả về một bộ dữ liệu). – paxdiablo

+1

Ngoài ra, hầu hết các ngôn ngữ tôi có thể nghĩ ra khỏi đầu của tôi có thể trả về một vectơ hoặc ít nhất một số loại cấu trúc dữ liệu để biểu diễn cả hai giá trị, nếu chúng muốn. – Cuga

+12

Pax, bạn có thấy tham chiếu được cung cấp không? Đến đó và đọc câu áp chót trong đoạn trên những cầu vồng xinh đẹp. –

1

bạn luôn có thể cho biết số khác là gì, vì vậy có thể không cần phải trả lại cả hai.

5

Bởi vì nhiều loại trả lại rất khó thực hiện. Nếu bạn thực sự cần kết quả khác, không phải là nó dễ dàng, đủ để chỉ nhiều kết quả bởi -1?

10

Trả lại một số dễ dàng hơn để trả về hai số. Hầu hết các quyết định kỹ thuật được thực hiện theo cách này.

12

Vài suy nghĩ:

  • Về mặt lịch sử, các chức năng được xác định là thủ tục mà trả lại một giá trị duy nhất .

  • Nó sẽ khó sử dụng (sử dụng cấu trúc lập trình nguyên thủy) để xác định hàm sạch trả lại nhiều giá trị như thế này.

  • Luôn luôn có những trường hợp ngoại lệ đến quy tắc:

    • 0 ví dụ chỉ có một đơn root (0).
    • Bạn không thể lấy căn bậc hai của số số âm (trừ khi ngôn ngữ hỗ trợ số phức). Điều này có thể được coi là ngoại lệ (như "chia cho 0") bằng các ngôn ngữ không hỗ trợ số ảo hoặc hệ thống số phức.
  • Nó thường đơn giản để suy 2 căn bậc hai (chỉ đơn giản là phủ nhận giá trị trả về của hàm). Điều này có lẽ còn lại là một bài tập của người gọi hàm sqrt(), nếu tên miền của họ phụ thuộc vào việc xử lý cả hai gốc (+) và âm (-).

+0

Apropos căn bậc hai của số âm: Ít nhất Lisp xử lý điều này và trả về số phức 0 + 1i: ? (sqrt -1) #C (0 1) –

+0

Ý của bạn là: Trong các ngôn ngữ không hỗ trợ số ảo, không thể lấy căn bậc hai của số âm. – Eddie

+0

Cảm ơn - đã lưu ý đúng (và đã chỉnh sửa câu trả lời của tôi một cách thích hợp). – LeopardSkinPillBoxHat

17

Nếu phương pháp gốc bình phương trả lại hai giá trị, thì một trong hai giá trị đó thực tế sẽ luôn bị hủy. Ngoài việc lãng phí bộ nhớ và độ phức tạp trên giá trị trả về thêm, nó sẽ ít được sử dụng. Mọi người đều biết rằng bạn có thể trả lời nhiều câu trả lời bằng cách -1 và nhận được thư mục gốc khác.

Tôi hy vọng rằng chỉ các ngôn ngữ toán học mới trả về nhiều giá trị ở đây, có lẽ là một mảng hoặc ma trận. Nhưng đối với hầu hết các ngôn ngữ lập trình có mục đích chung, có mức tăng không đáng kể và chi phí không đáng kể để thực hiện như bạn đề xuất.

8

Trong toán học, theo quy ước, nó luôn luôn giả định rằng bạn muốn căn bậc hai dương của một cái gì đó trừ khi bạn nói một cách rõ ràng khác. Căn bậc hai của bốn thực sự là hai. Nếu bạn muốn câu trả lời tiêu cực, hãy đặt dấu âm ở phía trước. Nếu bạn muốn cả hai, hãy đặt dấu cộng hoặc dấu trừ. Nếu không có quy ước này thì sẽ không thể viết phương trình; bạn sẽ không bao giờ biết những gì người dự định ngay cả khi họ đã đặt một dấu hiệu ở phía trước (vì nó có thể là tiêu cực của căn bậc hai âm, ví dụ). Ngoài ra, làm thế nào chính xác bạn sẽ viết bất kỳ loại mã máy tính liên quan đến toán học nếu các nhà khai thác bắt đầu trở về hai giá trị? Nó sẽ phá vỡ mọi thứ.

Ngoại lệ không may đối với quy ước này là khi giải quyết các biến. Trong phương trình sau:

x^2 = 4

Bạn không có lựa chọn nào khác để xem xét cả hai giá trị có thể cho X. nếu bạn lấy căn bậc hai của cả hai bên, bạn sẽ có được x = 2 nhưng bây giờ bạn phải đặt dấu cộng hoặc dấu trừ để đảm bảo bạn không thiếu bất kỳ giải pháp nào có thể. Ngoài ra, hãy nhớ rằng trong trường hợp này, kỹ thuật X có thể là cộng hoặc trừ, không phải là căn bậc hai của bốn.

+2

"Trong toán học, theo quy ước nó luôn luôn giả định rằng bạn muốn căn bậc hai dương của một cái gì đó trừ khi bạn nói một cách rõ ràng khác" - xin lỗi này là 100% không chính xác. – DanSingerman

+0

Wow Philip, đó là một phản ứng thực sự khắc nghiệt. – Albert

1

Có thể vì khi mọi người sử dụng máy tính để tìm ra căn bậc hai, họ chỉ muốn giá trị dương.

Đi thêm một bước nữa và hỏi tại sao máy tính của bạn sẽ không cho phép bạn lấy căn bậc hai của số âm. Có thể, bằng cách sử dụng số ảo, nhưng người dùng trung bình hoàn toàn không sử dụng cho điều này.

On imaginary numbers.

+2

Sự khác biệt là không có số REAL nào có thể được cung cấp làm câu trả lời cho "Căn bậc hai của ?". Bạn cần sử dụng hệ thống số COMPLEX. Vì vậy, tôi không chắc chắn điều này có liên quan như thế nào đối với câu hỏi đang được hỏi.Thực tế là, có (hầu như luôn luôn) 2 số REAL là rễ vuông hợp lệ của một số nguyên dương. Một lần nữa, tôi nghĩ nó sẽ trở lại miền. Nếu người dùng quan tâm đến cả + và - root, họ có thể lấy chúng khá dễ dàng từ những gì sqrt() trả về. Đôi khi chủ nghĩa thực dụng ghi đè chính xác. – LeopardSkinPillBoxHat

+0

Đồng ý với chủ nghĩa thực dụng. Ví dụ về số ảo là để cho thấy tính năng không thực tế như thế nào đối với bất kỳ người dùng thông thường nào. – Cuga

2

Tôi nghĩ rằng bởi vì chức năng được gọi là "sqrt", và nếu bạn muốn nhiều rễ, bạn sẽ phải gọi hàm "sqrts", mà không tồn tại, vì vậy bạn không thể làm được nó.

Câu trả lời nghiêm túc hơn là bạn đang đề xuất một ví dụ cụ thể về vấn đề lớn hơn. Nhiều phương trình, và các hàm nghịch đảo phổ biến (bao gồm sqrt) có nhiều giải pháp có thể, chẳng hạn như arcsin, vv, và nói chung, đây là một vấn đề. Ví dụ, với arcsin, có nên trả về một số câu trả lời vô hạn? Xem, ví dụ: các cuộc thảo luận về branch cuts.

3

Bởi vì hầu hết các lập trình viên chỉ có muốn một câu trả lời.

Thật dễ dàng, đủ để tạo ra giá trị âm từ giá trị dương nếu người gọi muốn. Đối với hầu hết mã, người gọi chỉ sử dụng giá trị dương.


Tuy nhiên, ngày nay thật dễ dàng trả về hai giá trị bằng nhiều ngôn ngữ. Trong JavaScript:

var sqrts=function(x) { 
    var s=Math.sqrt(x); 
    if (s>0) { 
    return [s,-s]; 
    } else { 
    return [0]; 
    } 
} 

Miễn là người gọi biết lặp qua mảng quay lại, bạn là vàng.

>sqrts(2) 
[1.4142135623730951, -1.4142135623730951] 
9

Có nhiều chức năng chỉ trả về 1 câu trả lời từ 2 hoặc nhiều khả năng. Arc tangent chẳng hạn. Đoạn tiếp tuyến của 1 được trả về là 45 độ, nhưng nó cũng có thể là 225 hoặc thậm chí 405.Cũng như nhiều thứ trong cuộc sống và lập trình, có một quy ước mà chúng ta biết và có thể dựa vào. Các hàm bậc hai trả về các giá trị dương là một trong số chúng. Đó là vào chúng tôi, các lập trình viên, để ghi nhớ có những giải pháp khác và hành động trên chúng nếu cần thiết trong mã. Bằng cách này đây là một vấn đề phổ biến trong robot khi giao dịch với động học và phương trình động học nghịch đảo, nơi có nhiều giải pháp của các vị trí liên kết tương ứng với các vị trí Descartes.

+1

Cá nhân tôi tìm thấy câu trả lời thỏa mãn nhất. +1. –

2

Bởi vì nó được xác định trong lịch sử {{citation needed}} là hàm cung cấp chiều dài cạnh của một hình vuông bề mặt đã biết. Và chiều dài là tích cực trong bối cảnh đó.

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