我一直在玩D的内联汇编程序和SSE,但发现了一些我不理解的东西.当我尝试在声明后立即添加两个float4向量时,计算是正确的.如果我把计算放在一个单独的函数中,我得到一系列的nans.
//function contents identical to code section in unittest
float4 add(float4 lhs, float4 rhs)
{
float4 res;
auto lhs_addr = &lhs;
auto rhs_addr = &rhs;
asm
{
mov RAX, lhs_addr;
mov RBX, rhs_addr;
movups XMM0, [RAX];
movups XMM1, [RBX];
addps XMM0, XMM1;
movups res, XMM0;
}
return res;
}
unittest
{
float4 lhs = {1, 2, 3, 4};
float4 rhs = {4, 3, 2, 1};
println(add(lhs, rhs)); //float4(nan, nan, nan, nan)
//identical code starts here
float4 res;
auto …Run Code Online (Sandbox Code Playgroud) 我正在尝试展平贝塞尔曲线路径(删除所有交叉点并替换为端点)作为此处描述的渲染算法实现的一部分,并找到了 GPU Gems 3 Ch 中的 Loop 和 Blinn 描述的算法。25,对 $a3$ 的叉积进行校正以检测曲线自相交(循环)。
\n该算法要求对表达式求值discr=d\xe2\x82\x81\xc2\xb2(3d\xe2\x82\x82\xc2\xb2-4d\xe2\x82\x81d\xe2\x82\x83),使得曲线自相交当且仅当discr < 0。
在哪里
\nd\xe2\x82\x81=a\xe2\x82\x81-2a\xe2\x82\x82+3a\xe2\x82\x83,\n d\xe2\x82\x82=-a\xe2\x82\x82+3a\xe2\x82\x83,\nd\xe2\x82\x83=3a\xe2\x82\x83
a\xe2\x82\x81=b\xe2\x82\x80\xc2\xb7(b\xe2\x82\x83\xe2\xa8\xafb\xe2\x82\x82),\n a\xe2\x82\x82=b\xe2\x82\x81\xc2\xb7(b\xe2\x82\x80\xe2\xa8\xafb\xe2\x82\x83),\na\xe2\x82\x83=b\xe2\x82\x82\xc2\xb7(b\xe2\x82\x81\xe2\xa8\xafb\xe2\x82\x80)
我已经在下面的示例代码中实现了该算法,以及我能找到的其他一些算法。他们谁都不同意,而且全都错了。具体来说,我已经实施了
\n这三种算法的不一致表明存在重大误解。它是什么?(更重要的是)我自己如何识别这样的问题?
\n我参考了这里和这里的问题,以及Loop 和 Blinn 描述他们方法的论文,但没有效果。
\n\n#[derive(Clone, Copy, Debug, PartialEq)]\nenum Kind {\n Serpentine,\n …Run Code Online (Sandbox Code Playgroud) 第一次海报.我已经使用Java几年了,并决定学习D.在Java中,你可以声明一个具有泛型类的类,并从该类创建一个新对象.喜欢:
public class foo<T>
{
public foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)
然后简单地打电话foo<String> f = new foo<>();.我尝试在D中实现相同的,但我得到了一个编译错误,如:"class core.collection.RingBuffer.RingBuffer(T)用作类型".看一下D的教程,我发现泛型编程是使用模板实现的.但是,我无法正式编写官方教程/文档.有人可以向我解释一下吗?谢谢.