15

ほとんどのプログラミング言語は、4の平方根に対する答えとして2を与えます。しかし、2つの答え:2-2があります。歴史的またはその他の理由で、なぜ1つの答えしか与えられないのか、という特別な理由はありますか?ほとんどのプログラミング言語は、なぜ4の平方根に対して1つの答えしか与えないのですか?

+2

"return all roots"を扱うために拡張すると、複素数をサポートする言語が必要になります。 –

+0

その言語の名前は? – bugmagnet

+0

そのような言語の名前は英語です。 :) – mbaitoff

答えて

37

:特に断りのない限り数学

  • は、一般 X√、主 Xの(すなわち、正の)ルート[http://mathworld.wolfram.com/SquareRoot.html]を指します。
  • 言語によっては、複数の値を返す機能がありません。
  • ネゲーションを適用できるだけなので、両方を返すと冗長になります。
+5

私はそうは思わない!数学では、方程式f(x)= sqrt(x)の解はx = +/- 2です。これは、選択したドメイン(自然数、整数、実数など)に完全に依存します。プログラムは-veの数を許すので、数学は両方の解を返すよう指示する。これはプログラミング言語を制限する実用主義です(Pythonは常にタプルを返すことができます)。 – paxdiablo

+1

さらに、私が頭の上から外して考えることができる言語のほとんどは、ベクトルまたは少なくともいくつかの型のデータ構造体を返すことができ、両方の値を表現することができます。 – Cuga

+12

Pax、参照は表示されていませんか?そこに行って、かなり虹の上のパラグラフの最後から2番目の文章を読んでください。 –

1

あなたはいつも他の番号を知ることができるので、両方を返す必要はないかもしれません。

5

複数の戻り値の型が実装するのが面倒です。他の結果が本当に必要な場合は、結果を-1倍にするのは簡単ではないでしょうか?

10

2を返すよりも1つの数値を返す方が簡単です。ほとんどの工学的決定はこのようにして行われます。ため

12

いくつかの考え:

  • 歴史的には、機能は単一の値を返されたプロシージャとして定義されていました。

  • の複数の値をこのように返すクリーンな関数を定義するために、(プリミティブなプログラミング構造を使用して)面倒なことがあったでしょう。

  • は常に例外がありますルールに:例えば

    • 0のみ単一のルートを持っている(0)。
    • の平方根を(複素数をサポートしていない場合)にすることはできません。これは、虚数または複素数システムをサポートしない言語では例外(「0で除算」など)として扱うことができます。 2つの平方根を推定する
  • は、それは通常、簡単である(単に関数によって返された値を否定)。 ドメインが正(+)と負( - )の両方のルーツを扱うことに依存していた場合、sqrt()関数の呼び出し側はこれを実行した可能性があります。

+0

Apropos負の数の平方根:少なくともLispはこれを処理し、複素数0 + 1iを返します: ? (sqrt -1) #C(0 1) –

+0

意味:虚数をサポートしていない言語では、負の数の平方根をとることはできません。 – Eddie

+0

ありがとうございます - 正式に記載されています(適切に私の答えを編集しました)。 – LeopardSkinPillBoxHat

17

平方根法が2つの値を返した場合、その2つのうちの1つは事実上常に破棄されます。余分な戻り値でメモリと複雑さを浪費することに加えて、ほとんど使用されません。 -1によって返された回答を複数回返すことができ、もう1つのルートを取得できることは誰もが知っています。

数学的な言語だけがここでは複数の値を返すことが期待されます。おそらく配列や行列として返されます。しかし、ほとんどの汎用プログラミング言語では、あなたが示唆するように、無視できるほどの利益と無視できない費用があります。

8

数学では、慣例により、明示的にそうでない限り、何かの正の平方根が欲しいと常に仮定されています。 4の平方根は実際には2です。否定的な答えが必要な場合は、前にマイナス記号を付けます。両方が必要な場合は、プラス記号またはマイナス記号を付けます。この規約がなければ、方程式を書くことは不可能です。正面に記号を置いたとしても、人が何を意図したのかは決して分かりません(たとえば、負の平方根が負である可能性があるため)。また、演算子が2つの値を返すようになった場合、数学を含むコンピュータコードをどのくらい正確に書くことになりますか?それはすべてを破るだろう。

この規約の残念な例外は、変数を解決するときです。次の式では:

のx^2 = 4

あなたは、両側の平方根を取る場合、あなたはX = 2を取得したが、今あなたがしなければならないX用の両方の可能な値を検討するしかありませんあなたが可能な解決策を見逃していないことを確認するためにプラス記号またはマイナス記号を入れてください。また、この場合は技術的にXで、4の平方根ではなく、プラスまたはマイナスのどちらでもかまいません。

+2

「数学では、慣例により、明示的にそうでない限り、何かの正の平方根が欲しいと常に仮定されています」 - 残念ですが、これは100%間違っています。 – DanSingerman

+0

Wow Philip、それは本当に厳しい対応です。 – Albert

1

人々が電卓を使用して平方根を計算するとき、正の値がほしいからです。

さらに進んで、電卓が負の数の平方根を取らない理由を尋ねます。虚数を使用することは可能ですが、平均的なユーザーはこれを全く使用していません。

On imaginary numbers.

+2

違いは、 "<負の数>の平方根は何ですか?"に対する答えとして提供できるREAL数がないことです。 COMPLEX番号システムを使用する必要があります。 私はこれがどのように質問されていることに関連しているのか分かりません。実際、正の整数の有効な平方根である(ほとんどの場合)2つのREAL数があります。 もう一度、私はそれがドメインに戻ってくると思います。ユーザーが+と - ルートの両方に興味がある場合、sqrt()が返すものから非常に簡単に導き出すことができます。時には実用主義が正しさを上回る。 – LeopardSkinPillBoxHat

+0

実用性に同意します。虚数の例は、そのような特徴がどのような通常のユーザにとっても実用的でないことを示すことであった。 – Cuga

2

機能が「SQRT」と呼ばれているので、私が思うに、あなたが複数のルートを望んでいた場合、あなたは存在しない機能「sqrts」を、呼び出す必要がありますので、あなたが行うことはできませんそれ。

より深刻な答えは、より大きな問題の特定のインスタンスを提案しているということです。多くの方程式、一般に逆関数(sqrtを含む)には、arcsinなどの複数の可能な解があり、これらは一般的に問題です。例えば、arcsinでは無限の答えを返しますか?たとえば、branch cutsに関する議論を参照してください。

3

ほとんどのプログラマーはがほしいと思うので、を1つ答えてください。

発信者が希望する場合は、正の値から負の値を生成するのは簡単です。ほとんどのコードでは、発信者は正の値のみを使用します。


しかし、今日では複数の言語で2つの値を返すのは簡単です。 JavaScriptの場合:

呼び出し元が戻ってくる配列を繰り返し処理することが分かっている限り、あなたは金です。

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

2つ以上の可能性から1つの回答しか返さない関数が多数あります。アークタンジェント。 1の逆正接は45度として返されますが、225または405でも可能です。人生とプログラミングの多くの事柄と同様に、私たちが知っている頼りになる慣習があります。平方根関数は正の値を返します。プログラマーたちは、他の解決策があり、必要に応じてコード内で行動することを念頭におくのは、私たちの責任です。

ところで、これは、直交座標に対応するリンク位置の複数の解が存在する場合には、運動学および逆運動学の方程式を扱う際のロボット工学における共通の問題である。

+1

私は個人的には、この答えが最も満足しています。 +1。 –

2

既知のサーフェスの正方形の辺の長さを与える関数として、歴史的に定義されていた{{citation needed}}。その文脈で長さはプラスです。

関連する問題