- 静态方法:比较运算
- SIMD.%type%.equal(),SIMD.%type%.notEqual()
- SIMD.%type%.greaterThan(),SIMD.%type%.greaterThanOrEqual()
- SIMD.%type%.lessThan(),SIMD.%type%.lessThanOrEqual()
- SIMD.%type%.select()
- SIMD.%BooleanType%.allTrue(),SIMD.%BooleanType%.anyTrue()
- SIMD.%type%.min(),SIMD.%type%.minNum()
- SIMD.%type%.max(),SIMD.%type%.maxNum()
静态方法:比较运算
SIMD.%type%.equal(),SIMD.%type%.notEqual()
equal
方法用来比较两个 SIMD 值a
和b
的每一个通道,根据两者是否精确相等(a === b
),得到一个布尔值。最后,所有通道的比较结果,组成一个新的 SIMD 值,作为掩码返回。notEqual
方法则是比较两个通道是否不相等(a !== b
)。
var a = SIMD.Float32x4(1, 2, 3, 9);
var b = SIMD.Float32x4(1, 4, 7, 9);
SIMD.Float32x4.equal(a,b)
// Bool32x4[true, false, false, true]
SIMD.Float32x4.notEqual(a,b);
// Bool32x4[false, true, true, false]
SIMD.%type%.greaterThan(),SIMD.%type%.greaterThanOrEqual()
greatThan
方法用来比较两个 SIMD 值a
和b
的每一个通道,如果在该通道中,a
较大就得到true
,否则得到false
。最后,所有通道的比较结果,组成一个新的 SIMD 值,作为掩码返回。greaterThanOrEqual
则是比较a
是否大于等于b
。
var a = SIMD.Float32x4(1, 6, 3, 11);
var b = SIMD.Float32x4(1, 4, 7, 9);
SIMD.Float32x4.greaterThan(a, b)
// Bool32x4[false, true, false, true]
SIMD.Float32x4.greaterThanOrEqual(a, b)
// Bool32x4[true, true, false, true]
SIMD.%type%.lessThan(),SIMD.%type%.lessThanOrEqual()
lessThan
方法用来比较两个 SIMD 值a
和b
的每一个通道,如果在该通道中,a
较小就得到true
,否则得到false
。最后,所有通道的比较结果,会组成一个新的 SIMD 值,作为掩码返回。lessThanOrEqual
方法则是比较a
是否等于b
。
var a = SIMD.Float32x4(1, 2, 3, 11);
var b = SIMD.Float32x4(1, 4, 7, 9);
SIMD.Float32x4.lessThan(a, b)
// Bool32x4[false, true, true, false]
SIMD.Float32x4.lessThanOrEqual(a, b)
// Bool32x4[true, true, true, false]
SIMD.%type%.select()
select
方法通过掩码生成一个新的 SIMD 值。它接受三个参数,分别是掩码和两个 SIMD 值。
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var mask = SIMD.Bool32x4(true, false, false, true);
SIMD.Float32x4.select(mask, a, b);
// Float32x4[1, 6, 7, 4]
上面代码中,select
方法接受掩码和两个 SIMD 值作为参数。当某个通道对应的掩码为true
时,会选择第一个 SIMD 值的对应通道,否则选择第二个 SIMD 值的对应通道。
这个方法通常与比较运算符结合使用。
var a = SIMD.Float32x4(0, 12, 3, 4);
var b = SIMD.Float32x4(0, 6, 7, 50);
var mask = SIMD.Float32x4.lessThan(a,b);
// Bool32x4[false, false, true, true]
var result = SIMD.Float32x4.select(mask, a, b);
// Float32x4[0, 6, 3, 4]
上面代码中,先通过lessThan
方法生成一个掩码,然后通过select
方法生成一个由每个通道的较小值组成的新的 SIMD 值。
SIMD.%BooleanType%.allTrue(),SIMD.%BooleanType%.anyTrue()
allTrue
方法接受一个 SIMD 值作为参数,然后返回一个布尔值,表示该 SIMD 值的所有通道是否都为true
。
var a = SIMD.Bool32x4(true, true, true, true);
var b = SIMD.Bool32x4(true, false, true, true);
SIMD.Bool32x4.allTrue(a); // true
SIMD.Bool32x4.allTrue(b); // false
anyTrue
方法则是只要有一个通道为true
,就返回true
,否则返回false
。
var a = SIMD.Bool32x4(false, false, false, false);
var b = SIMD.Bool32x4(false, false, true, false);
SIMD.Bool32x4.anyTrue(a); // false
SIMD.Bool32x4.anyTrue(b); // true
注意,只有四种布尔值数据类型(Bool32x4
、Bool16x8
、Bool8x16
、Bool64x2
)才有这两个方法。
这两个方法通常与比较运算符结合使用。
var ax4 = SIMD.Float32x4(1.0, 2.0, 3.0, 4.0);
var bx4 = SIMD.Float32x4(0.0, 6.0, 7.0, 8.0);
var ix4 = SIMD.Float32x4.lessThan(ax4, bx4);
var b1 = SIMD.Int32x4.allTrue(ix4); // false
var b2 = SIMD.Int32x4.anyTrue(ix4); // true
SIMD.%type%.min(),SIMD.%type%.minNum()
min
方法接受两个 SIMD 值作为参数,将两者的对应通道的较小值,组成一个新的 SIMD 值返回。
var a = SIMD.Float32x4(-1, -2, 3, 5.2);
var b = SIMD.Float32x4(0, -4, 6, 5.5);
SIMD.Float32x4.min(a, b);
// Float32x4[-1, -4, 3, 5.2]
如果有一个通道的值是NaN
,则会优先返回NaN
。
var c = SIMD.Float64x2(NaN, Infinity)
var d = SIMD.Float64x2(1337, 42);
SIMD.Float64x2.min(c, d);
// Float64x2[NaN, 42]
minNum
方法与min
的作用一模一样,唯一的区别是如果有一个通道的值是NaN
,则会优先返回另一个通道的值。
var ax4 = SIMD.Float32x4(1.0, 2.0, NaN, NaN);
var bx4 = SIMD.Float32x4(2.0, 1.0, 3.0, NaN);
var cx4 = SIMD.Float32x4.min(ax4, bx4);
// Float32x4[1.0, 1.0, NaN, NaN]
var dx4 = SIMD.Float32x4.minNum(ax4, bx4);
// Float32x4[1.0, 1.0, 3.0, NaN]
SIMD.%type%.max(),SIMD.%type%.maxNum()
max
方法接受两个 SIMD 值作为参数,将两者的对应通道的较大值,组成一个新的 SIMD 值返回。
var a = SIMD.Float32x4(-1, -2, 3, 5.2);
var b = SIMD.Float32x4(0, -4, 6, 5.5);
SIMD.Float32x4.max(a, b);
// Float32x4[0, -2, 6, 5.5]
如果有一个通道的值是NaN
,则会优先返回NaN
。
var c = SIMD.Float64x2(NaN, Infinity)
var d = SIMD.Float64x2(1337, 42);
SIMD.Float64x2.max(c, d)
// Float64x2[NaN, Infinity]
maxNum
方法与max
的作用一模一样,唯一的区别是如果有一个通道的值是NaN
,则会优先返回另一个通道的值。
var c = SIMD.Float64x2(NaN, Infinity)
var d = SIMD.Float64x2(1337, 42);
SIMD.Float64x2.maxNum(c, d)
// Float64x2[1337, Infinity]