我看到了以[first1,last1)
和表示的数字范围[first2,last2)
。
我想知道这种表示法的含义。
我看到了以[first1,last1)
和表示的数字范围[first2,last2)
。
我想知道这种表示法的含义。
Answers:
方括号表示范围的末尾包含在内 -包括列出的元素。括号表示end是互斥的,并且不包含列出的元素。因此[first1, last1)
,范围以first1
(并包括)开始,但在之前结束last1
。
假设整数:
间隔符号的概念在数学和计算机科学中都出现过。数学表示法[
,]
,(
,)
表示所述结构域(或 范围的间隔)。
方括号[
和]
含义:
括号(
和)
含义:
具有混合状态的间隔称为“半开”。
例如,从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)而不是稍微冗长的[0,N-1] 的通用用法 :
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 -数学算法元素。例如Python索引开始
间隔符号对于浮点数也很重要,以避免微妙的错误。
当处理浮点数时,尤其是在计算机图形学中(颜色转换,计算几何,动画缓和/融合等),通常会使用标准化数。即,介于0.0和1.0之间的数字。
重要的是要知道端点是包含端点还是排斥端点:
其中M是一些机器epsilon。这就是为什么您有时会const float EPSILON = 1e-#
在C代码(例如1e-6
)中看到成语的32位浮点数的原因。这样的问题EPSILON保证什么吗?有一些初步的细节。有关更全面的答案,请参见FLT_EPSILON
和David Goldberg的《每位计算机科学家应该了解的有关浮点算法的知识》。
随机数生成器的某些实现random()
可能会产生0.0 .. 0.999 ...范围内的值,而不是更方便的0.0 .. 1.0。代码中正确的注释将以[0.0,1.0)或[0.0,1.0]的形式记录下来,因此用法上没有歧义。
例:
random()
颜色。您将三个浮点值转换为无符号的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节“ 稳健浮点用法”。
[first, last)
正如其他人所指出的,这是一个半开放时间间隔。在某些教科书中,这也被写成[first, last>
并具有完全相同的含义,只是语法不同。