
数学では、2で割る、つまり半分にすることは、メディエーションまたはディミディエーションとも呼ばれています。[1]これを他の数による乗算や除算とは異なる演算として扱うことは、古代エジプトにまで遡ります。彼らの乗算アルゴリズムでは、 2で割ることが基本的なステップの1つでした。[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進浮動小数点
2進浮動小数点演算では、指数を1減らすことで2で割ることができます(結果が非正規数でない限り)。多くのプログラミング言語は、浮動小数点数を2の累乗で割るために使用できる関数を提供しています。たとえば、Javaプログラミング言語はjava.lang.Math.scalb2の累乗でスケーリングする方法を提供し、 [7] Cプログラミング言語はldexp同じ目的のために関数を提供しています。 [8]
小数点
次のアルゴリズムは 10 進数用です。ただし、任意の偶数基数の任意の数Nの半分を取るアルゴリズムを構築するためのモデルとして使用できます。
- N を書き、その左側にゼロを付けます。
- 重なり合うペアのNの数字を調べ、次の表の結果の数字を書き留めます。
例: 1738/2=?
01738 と書きます。次に結果を求めます。
- 01: 偶数桁の後に 1 が続く場合は 0 と書きます。
- 17: 奇数桁の後に 7 が続く場合は 8 と書きます。
- 73: 奇数の後に 3 が続く場合は 6 と書きます。
- 38: 奇数桁の後に 8 が続く場合は、9 と書きます。
結果: 0869。
例から、0 は偶数であることがわかります。
Nの最後の桁が奇数の場合は、結果に 0.5 を加算する必要があります。
参照
- 半分
- 中央値、データ値のセットを2つの等しいサブセットに分割する値
- 二等分、幾何学的物体を二つの等しい半分に分割すること
- ディミディエーション、2つの紋章のデザインを半分に分割して結合する紋章技法
参考文献
- ^ スティール、ロバート(1922)、英語における最古の算術、Early English Text Society、第118巻、オックスフォード大学出版局、p. 82。
- ^ジャン= リュック・シャベール; Barbin、Évelyne (1999)、「アルゴリズムの歴史: 小石からマイクロチップまで」、Springer-Verlag、p. 16、ISBN 978-3-540-63369-3。
- ^ ジャクソン、ランバート・リンカーン(1906年)、現代から見た16世紀算数の教育的意義、教育への貢献、第8巻、コロンビア大学、p. 76。
- ^ ウォーターズ、EGR(1929)、「リエージュの15世紀フランスのアルゴリズム」、Isis、12(2):194–236、doi:10.1086 / 346408、JSTOR 224785、S2CID 144157808。
- ^ ab Wadleigh, Kevin R.; Crawford, Isom L. (2000)、高性能コンピューティングのためのソフトウェア最適化、Prentice Hall、p. 92、ISBN 978-0-13-017008-8。
- ^ フック、ブライアン(2005)、ポータブルコードを書く:複数のプラットフォーム向けのソフトウェア開発入門、No Starch Press、p. 133、ISBN 978-1-59327-056-8。
- ^ "Math.scalb". Java Platform Standard Ed. 6 . 2009-10-11閲覧。
- ^ プログラミング言語 — C、国際規格 ISO/IEC 9899:1999、セクション7.12.6.6。
