Почему большинство языков программирования дают только один ответ для квадратного корня из 4? - PullRequest
15 голосов
/ 08 мая 2009

Большинство языков программирования дают 2 в качестве ответа на квадратный корень из 4. Однако есть два ответа: 2 и -2. Есть ли какая-то конкретная причина, историческая или иная, почему обычно дается только один ответ?

Ответы [ 12 ]

37 голосов
/ 08 мая 2009

Потому что:

  • В математике √ x обычно, если не указано иное, относится к основному (т.е. положительному) корню x [http://mathworld.wolfram.com/SquareRoot.html].
  • Некоторые языки не могут возвращать более одного значения.
  • Поскольку вы можете просто применить отрицание, возврат обоих будет излишним.
17 голосов
/ 08 мая 2009

Если метод квадратного корня вернул два значения, то одно из этих двух значений практически всегда будет отброшено. В дополнение к напрасной трате памяти и сложности на дополнительное возвращаемое значение, оно будет мало использовано. Все знают, что вы можете умножить ответ, полученный на -1, и получить другой корень.

Я ожидаю, что только математические языки будут возвращать несколько значений здесь, возможно, в виде массива или матрицы. Но для большинства языков программирования общего назначения вы получаете незначительный выигрыш и немаловажную стоимость, как вы предлагаете.

12 голосов
/ 08 мая 2009

Некоторые мысли:

  • Исторически функции определялись как процедуры, которые возвращали одно значение .

  • Было бы непросто (используя примитивные программные конструкции) определить чистую функцию, которая возвращала бы несколько значений , как это.

  • Всегда есть исключения из правила:

    • 0 имеет только single root (0).
    • Вы не можете получить квадратный корень из отрицательного числа (если язык не поддерживает комплексные числа). Это можно рассматривать как исключение (например, «делить на 0») в языках, которые не поддерживают мнимые числа или систему комплексных чисел.
  • Обычно просто выводить 2 квадратных корня (просто отрицать значение, возвращаемое функцией). Вероятно, это было оставлено в качестве упражнения вызывающей функцией sqrt (), если их домен зависел от работы с положительными (+) и отрицательными (-) корнями.

10 голосов
/ 08 мая 2009

Проще вернуть один номер, чем вернуть два. Большинство инженерных решений принимаются именно таким образом.

9 голосов
/ 26 июня 2009

Есть много функций, которые возвращают только 1 ответ из 2 или более возможностей. Арктангенс например. Арктангенс 1 возвращается как 45 градусов, но он также может быть 225 или даже 405. Как и во многих вещах в жизни и программировании, существует соглашение, которое мы знаем и на которое можно положиться. Функции квадратного корня возвращают положительные значения - одно из них. Мы, программисты, должны помнить, что существуют другие решения и действовать в случае необходимости в коде.

Кстати, это общая проблема в робототехнике при работе с уравнениями кинематики и обратной кинематики, где существует множество решений позиций связей, соответствующих декартовым позициям.

8 голосов
/ 08 мая 2009

В математике, по соглашению, всегда предполагается, что вы хотите получить положительный квадратный корень чего-либо, если вы явно не скажете иначе. Квадратный корень из четырех действительно два. Если вы хотите получить отрицательный ответ, поставьте перед собой отрицательный знак. Если вы хотите и то и другое, поставьте знак плюс или минус. Без этого соглашения было бы невозможно написать уравнения; Вы никогда не узнаете, что имел в виду человек, даже если бы он поставил знак впереди (потому что это может быть отрицательный знак отрицательного квадратного корня, например). Кроме того, как именно вы могли бы написать какой-либо компьютерный код с использованием математики, если бы операторы начали возвращать два значения? Это сломало бы все.

Печальное исключение из этого соглашения - при поиске переменных. В следующем уравнении:

x ^ 2 = 4

У вас нет выбора, кроме как рассмотреть оба возможных значения для X. Если вы берете квадратный корень с обеих сторон, вы получаете x = 2, но теперь вы должны поставить знак плюс или минус, чтобы убедиться, что вы не пропустили любые возможные решения. Кроме того, помните, что в этом случае технически X может быть плюс или минус, а не квадратный корень из четырех.

5 голосов
/ 08 мая 2009

Потому что несколько типов возврата раздражают для реализации. Если вам действительно нужен другой результат, не достаточно ли просто умножить результат на -1?

3 голосов
/ 24 июня 2009

Потому что большинство программистов только хотят один ответ.

Достаточно просто сгенерировать отрицательное значение из положительного значения, если этого хочет вызывающий. Для большей части кода вызывающая сторона использует только положительное значение.


Однако в настоящее время легко вернуть два значения во многих языках. В JavaScript:

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

Пока вызывающая сторона знает, как перебирать возвращаемый массив, вы - золото.

>sqrts(2)
[1.4142135623730951, -1.4142135623730951]
2 голосов
/ 03 августа 2010

Потому что это было исторически определено {{цитата нужна}} как функция, которая дает длину стороны квадрата известной поверхности. И длина в этом контексте положительна.

2 голосов
/ 08 мая 2009

Я думаю, потому что функция называется «sqrt», и если вам нужно несколько корней, вам придется вызывать функцию «sqrts», которой не существует, поэтому вы не можете это сделать.

Более серьезный ответ заключается в том, что вы предлагаете конкретный случай более крупной проблемы. Многие уравнения и обычно обратные функции (включая sqrt) имеют несколько возможных решений, таких как arcsin и т. Д., И это, как правило, проблема. Например, с помощью arcsin нужно возвращать бесконечное количество ответов? См., Например, обсуждения о ответвлениях .

...