2で割る

白い皿の上に半分に割られたオレンジ。
半分に切ったオレンジ。

数学では、2 で割るつまり半分にすることは、メディエーションまたはディミディエーションとも呼ばれています。[ 1 ]これを他の数による乗算や除算とは異なる演算として扱うことは、古代エジプト人にまで遡り、彼らの乗算アルゴリズムでは、基本的なステップの 1 つとして 2 による除算を使用していました。[ 2 ] 16 世紀になっても、一部の数学者は半分にすることを別の演算と見なし続けていて、[ 3 ] [ 4 ]現代のコンピュータプログラミングでも、多くの場合、個別に扱われ続けています。[ 5 ] この演算は、10 進演算、コンピュータプログラミングで使用される2 進数システム、およびその他の偶数基数では簡単に実行できます。奇数を 2 で割るには、数学解法( ( N −1)÷2)+0.5 を使用します。たとえば、N = 7 の場合、((7−1)÷2)+0.5=3.5 となるため、7÷2=3.5 となります。

バイナリ

2 進算術では、2 で割る演算は、数を 1 つ右にシフトするビット シフト演算によって実行できます。これは強度削減最適化の一形式です。たとえば、2 進数の 1101001 (10 進数の 105) を 1 つ右にシフトすると、110100 (10 進数の 52) になります。この場合、最下位ビットの 1 が削除されます。同様に、2 の任意の累乗2 kによる除算は、 k桁を右にシフトすることによって実行できます。ビット シフトは除算よりもはるかに高速な演算であることが多いため、このように除算をシフトに置き換えることは、プログラム最適化の有効なステップとなる可能性があります。[ 5 ]ただし、ソフトウェアの移植性と可読性を考慮すると、除算演算を使用してプログラムを作成し、この置き換えをコンパイラに任せるのが最善の場合がよくあります。[ 6 ] Common Lispからの例:

( setq番号#b1101001 ) ; #b1101001 — 105 (灰の番号-1 ) ; #b0110100 — 105 >> 1 ⇒ 52 (灰の番号-4 ) ; #b0000110 — 105 >> 4 ≡ 105 / 2⁴ ⇒ 6

しかし、上記の記述は、符号付き2進数の除算を扱う場合には必ずしも当てはまりません。1ビット右にシフトすると2で割ることになり、常に切り捨てられます。しかし、一部の言語では、符号付き2進数の除算は0に向かって丸められます(つまり、結果が負の場合は切り上げられます)。例えば、Javaはそのような言語の1つです。Javaでは、-3 / 2は と評価されます-1が、 は と-3 >> 1評価されます-2。そのため、この場合、被除数が負になる可能性があるにもかかわらず、コンパイラは2による除算をビットシフトに置き換えることで最適化すること はできません。

2進浮動小数点

二進浮動小数点演算では、指数を1減らすことで2で割ることができます(ただし、結果が非​​正規数にならない限り)。多くのプログラミング言語では、浮動小数点数を2のべき乗で割るための関数が提供されています。例えば、Javaプログラミング言語は2のべき乗でスケーリングする方法を提供しjava.lang.Math.scalb[ 7 ]Cプログラミング言語ldexpも同じ目的の関数を提供しています。 [ 8 ]

小数点

以下のアルゴリズムは10進数用です。ただし、任意の偶数基数Nの半分を求めるアルゴリズムを構築するためのモデルとして使用できます。

  • Nを書き、その左側にゼロを付けます。
  • Nの重なり合う数字のペアを調べ、次の表の結果の数字を書き留めます。
最初の数字が 奇数奇数奇数奇数奇数
そして2桁目は 0または12または34または56または78または9 0または12または34または56または78または9
書く 01234 56789

例: 1738/2=?

01738 と書きます。次に、結果を求めます。

  • 01: 偶数桁の後に 1 が続く場合は、0 と書き込みます。
  • 17: 奇数桁の後に 7 が続く場合は 8 と書きます。
  • 73: 奇数桁の後に 3 が続く場合は 6 と書きます。
  • 38: 奇数桁の後に 8 が続く場合は、9 と書きます。

結果: 0869。

この例から、 0 は偶数であることがわかります。

Nの最後の桁が奇数の場合は、結果に 0.5 を加算する必要があります。

参照

  • 半分
  • 中央値、データ値の集合を2つの等しいサブセットに分割する値
  • 二等分、幾何学的物体を二つの等しい半分に分割すること
  • ディミディエーション、紋章のデザインを半分に分割して2つの紋章を結合する紋章技法

参考文献

  1. ^スティール、ロバート(1922年)、英語における最古の算術、初期英語テキスト協会、第118巻、オックスフォード大学出版局、p.82
  2. ^ジャン=リュック・シャベール; Barbin、Évelyne (1999)、「アルゴリズムの歴史: 小石からマイクロチップまで」、Springer-Verlag、p. 16、ISBN 978-3-540-63369-3
  3. ^ジャクソン、ランバート・リンカーン(1906年)「現代から見た16世紀算術の教育的意義」『教育への貢献』第8巻、コロンビア大学、76ページ
  4. ^ウォーターズ、EGR(1929)、「リエージュ発の15世紀フランスのアルゴリズム」、Isis12(2):194–236doi10.1086/346408JSTOR 224785S2CID 144157808  
  5. ^ a b Wadleigh, Kevin R.; Crawford, Isom L. (2000),高性能コンピューティングのためのソフトウェア最適化, Prentice Hall, p.  92 , ISBN 978-0-13-017008-8
  6. ^フック、ブライアン(2005年)、移植可能なコードを書く:複数プラットフォーム向けソフトウェア開発入門、No Starch Press、p. 133、ISBN 978-1-59327-056-8
  7. ^ "Math.scalb" . Java Platform Standard Ed. 6. 2009年10月11日閲覧
  8. ^プログラミング言語 — C、国際規格 ISO/IEC 9899:1999、セクション7.12.6.6。