[first1,last1)
とで表される数値範囲を見てき[first2,last2)
ました。
そのような表記の意味を知りたいのですが。
角かっこ([
または]
)は、範囲の終わりが含まれることを意味します。これには、リストされている要素が含まれます。括弧-(
または)
-は、endが排他的であり、リストされた要素を含まないことを意味します。したがって、[first1, last1)
の場合、範囲はで始まりfirst1
(そしてそれを含みます)、の直前で終わりlast1
ます。
整数を想定:
これは、ハーフオープン間隔です。
[a,b]
が含まれます。(a,b)
を除外します。あなたの場合、間隔の開始時の終点が含まれますが、終点は除外されます。つまり、間隔「first1 <=x<last1」を意味します。
ハーフオープン間隔は、ループの一般的なイディオムに対応しているため、プログラミングに役立ちます。
for (int i = 0; i < n; ++i) { ... }
ここで、iは[0、n)の範囲にあります。
区間表記の概念は、数学とコンピュータサイエンスの両方で登場します。数学表記[
、、、は]
、区間の定義域(または 範囲(
)を示します。)
角かっこ[
と]
意味:
括弧(
と)
意味:
状態が混在する区間は「ハーフオープン」と呼ばれます。
たとえば、1 .. 10(両端を含む)からの連続する整数の範囲は、次のように表記されます。
その単語inclusive
がどのように使用されたかに注意してください。エンドポイントを除外したいが、同じ範囲を「カバー」したい場合は、エンドポイントを移動する必要があります。
区間の左端と右端の両方に、実際には4つの順列があります。
(1,10) = 2,3,4,5,6,7,8,9 Set has 8 elements
(1,10] = 2,3,4,5,6,7,8,9,10 Set has 9 elements
[1,10) = 1,2,3,4,5,6,7,8,9 Set has 9 elements
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set has 10 elements
これは数学とコンピュータサイエンスとどのように関係していますか?
配列インデックスは、どのフィールドにいるかに応じて異なるオフセットを使用する傾向があります。
これらの違いは、forループなどの数学的アルゴリズムを実装するときに、微妙なフェンスポストエラー(別名、オフバイワンバグ)につながる可能性があります。
集合または配列がある場合、たとえば最初のいくつかの素数の[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
場合、数学者は最初の要素を1st
絶対 要素と呼びます。つまり、インデックスを示すために添え字表記を使用します。
一部のプログラミング言語は、対照的に、最初の要素をzero'th
相対要素と呼びます。
配列のインデックスは[0、N-1]の範囲にあるため、わかりやすくするために、バイアスなどのテキストノイズを追加する代わりに、範囲0..Nに対して同じ数値を維持することをお勧めします。-1
たとえば、CまたはJavaScriptでは、N個の要素の配列を反復処理するために、プログラマーは i = 0, i < N
、少し冗長な[0、N-1]ではなく、間隔[0、N)での一般的なイディオムを記述します。
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 0; i < 10; i++ ) // [0,10)
output += "[" + i + "]: " + a[i] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById('output1').innerHTML = output;
}
<html>
<body onload="main();">
<pre id="output1"></pre>
</body>
</html>
数学者は1から数え始めるので、代わりにi = 1, i <= N
命名法を使用しますが、ここで、ゼロベースの言語で配列オフセットを修正する必要があります。
例えば
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 1; i <= 10; i++ ) // [1,10]
output += "[" + i + "]: " + a[i-1] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById( "output2" ).innerHTML = output;
}
<html>
<body onload="main()";>
<pre id="output2"></pre>
</body>
</html>
脇:
0ベースのプログラミング言語では、数学1ベースのアルゴリズムを使用するために、ダミーの0番目の要素のクラッジが必要になる場合があります。例:Python Index Start
微妙なバグを回避するために、浮動小数点数の間隔表記も重要です。
特にコンピュータグラフィックス(色変換、計算幾何学、アニメーションのイージング/ブレンディングなど)で浮動小数点数を処理する場合、正規化された数が使用されることがよくあります。つまり、0.0から1.0の間の数値です。
エンドポイントが包括的であるか排他的であるかを知ることは重要です。
ここで、Mは計算機イプシロンです。これが、32ビット浮動小数点数のconst float EPSILON = 1e-#
Cコード(など)にイディオムが表示される場合がある理由です。1e-6
このSOの質問EPSILONは何かを保証しますか?いくつかの予備的な詳細があります。より包括的な答えについてはFLT_EPSILON
、DavidGoldbergのすべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。
乱数ジェネレーターの一部の実装でrandom()
は、より便利な0.0 .. 1.0ではなく、0.0 ..0.999...の範囲の値が生成される場合があります。コード内の適切なコメントは、これを[0.0,1.0)または[0.0,1.0]として文書化するため、使用法に関してあいまいさはありません。
例:
random()
色を生成したい。3つの浮動小数点値を符号なし8ビット値に変換して、それぞれ赤、緑、青のチャネルを持つ24ビットピクセルを生成します。出力される間隔に応じて、random()
(near-white
254,254,254)またはwhite
(255,255,255)になる場合があります。 +--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
浮動小数点の精度と間隔を使用したロバスト性の詳細については、Christer Ericsonのリアルタイム衝突検出、第11章数値ロバストネス、セクション11.3ロバスト浮動小数点の使用法を参照してください。
これは、角括弧が「極値を含む」を意味し、丸括弧が「極値を除く」を意味する間隔の定義における数学的慣習である可能性があります。