なぜほとんどのプログラミング言語は4の平方根に対して1つの答えしか与えないのですか

StackOverflow https://stackoverflow.com/questions/838214

質問

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

役に立ちましたか?

解決

理由:

  • 数学では、特に指定しない限り、通常√ x x [ http://mathworld.wolfram.com/SquareRoot.html]
  • 一部の言語には、複数の値を返す機能がありません。
  • 否定を適用するだけなので、両方を返すことは冗長です。

他のヒント

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

ここでは、おそらく配列または行列として、数学言語のみが複数の値を返すと予想しています。しかし、ほとんどの汎用プログラミング言語では、提案どおりに行うことで取るに足らない利得と無視できないコストがあります。

いくつかの考え:

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

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

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

      たとえば、
    • 0には single ルート(0)のみがあります。
    • 負の数の平方根を取ることはできません(言語が複素数をサポートしていない限り)。これは、虚数または複素数システムをサポートしない言語では例外として扱われます(「0で割る」など)。
  • 通常、2つの平方根を推定するのは簡単です(関数が返す値を単純に否定します)。これはおそらく、 domain が正(+)と負(-)の両方のルートを処理することに依存している場合、sqrt()関数の呼び出し元による演習として残されました。

2つの数値を返すよりも1つの数値を返す方が簡単です。ほとんどのエンジニアリングの決定は、この方法で行われます。

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

ところで、これは、デカルト位置に対応するリンク位置の複数の解がある運動学および逆運動学方程式を扱うときのロボット工学の一般的な問題です。

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

この規約の不幸な例外は、変数を解くときです。次の方程式:

x ^ 2 = 4

Xの両方の可能な値を考慮する以外に選択肢はありません。両側の平方根を取ると、x = 2になりますが、プラスまたはマイナス記号を入力して、欠落がないことを確認する必要があります。可能な解決策。また、この場合、技術的にはXであり、4の平方根ではなく、プラスまたはマイナスのいずれかであることに注意してください。

複数の戻り値の型は実装するのが面倒なので。他の結果が本当に必要な場合は、結果を-1で乗算するだけでは簡単ではありませんか?

ほとんどのプログラマーは1つの答えのみを したいので。

呼び出し側が望むなら、正の値から負の値を生成するのは簡単です。ほとんどのコードでは、呼び出し元は正の値のみを使用します。


ただし、最近では多くの言語で2つの値を返すのは簡単です。 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]

関数は" sqrt"と呼ばれ、複数のルートが必要な場合は、関数" sqrts"を呼び出す必要がありますが、これは存在しないため、実行できません。

p>

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

これは、既知の表面の正方形の辺の長さを与える関数として歴史的に定義されているため{{要出典}}。そのコンテキストでは長さは正です。

他の数字はいつでもわかるので、両方を返す必要はないかもしれません。

電卓を使用して平方根を計算するとき、正の値のみが必要なためです。

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

虚数について

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top