C/CPP-将浮点算术转换为整数算术 我有以下C++函数(实现),见于
计算机图形从像素到可编程图形硬件 亚历克赛·波兹科夫,叶甫盖尼·希金 其中一个函数使用浮点数,由于其效率低下,本书介绍了另一个仅使用整数算术的函数C/CPP-将浮点算术转换为整数算术 我有以下C++函数(实现),见于,c++,c,algorithm,floating-point,integer,C++,C,Algorithm,Floating Point,Integer,计算机图形从像素到可编程图形硬件 亚历克赛·波兹科夫,叶甫盖尼·希金 其中一个函数使用浮点数,由于其效率低下,本书介绍了另一个仅使用整数算术的函数 我很难理解为什么这两个是等价的,为什么我们使用左移位浮点代码对d做四件事: 将d初始化为2dy/dx−1,其中dy和dx是yb−ya和xb−xa,分别为 评估d是否大于0 将2dy/dx+2添加到d 将2dy/dx添加到d 在浮点运算中,被dx除可能产生一个非整数。为了避免这种情况,我们通过将所有值乘以dx来转换操作,得到: 将d初始化为2dy−dx
我很难理解为什么这两个是等价的,为什么我们使用左移位
浮点代码对d
做四件事:
将d
初始化为2dy/dx−1,其中dy和dx是yb
−<代码>ya
和xb
−<代码>xa,分别为
d
是否大于0d
d
d
初始化为2dy−dxd
是否大于0dx(等于0)d
d
我们可以很容易地看到,除了3之外,这四个等价的操作都是在整数代码中实现的。整数代码显示为添加2dy−2dx到
d
。整数代码与中显示的代码匹配。我怀疑浮点版本中的+
是本书中的一个错误。浮点代码对d
有四个作用:
d
初始化为2dy/dx−1,其中dy和dx是yb
−<代码>ya和xb
−<代码>xa,分别为d
是否大于0d
d
d
初始化为2dy−dxd
是否大于0dx(等于0)d
d
我们可以很容易地看到,除了3之外,这四个等价的操作都是在整数代码中实现的。整数代码显示为添加2dy−2dx到
d
。整数代码与中显示的代码匹配。我怀疑浮点版本中的+
是本书中的一个错误。旧编译器可能会使用value@pmg发出更好的代码(为了获得更好的合适值)。我仍然不清楚为什么这些函数是等价的,如果我们从不使用除法,它们怎么能给出相同的输出(例如,我认为斜率k
必须用除法表示,但在第二个函数中没有k
,也没有除法)啊……你的问题比我想象的要深刻,对不起。所有的ds在int版本中都是dx的三倍。因为它们只与零相比……我确实看到了什么看起来像是打字错误,a+和-交换?@Yakk AdamNevraumont我这边没有打字错误,我不能说如果作者有打字错误,旧的编译器可能会发出更好的(为了更好的合适值)用value@pmg编码我仍然不清楚为什么函数是等价的,如果我们不使用除法,它们如何能给出相同的输出(例如,我认为斜率k
必须用除法表示,但在第二个函数中没有k
,也没有除法)啊……你的问题比我想象的要深刻,对不起。所有的ds在int版本中都是dx的三倍。因为它们只与零相比……我确实看到了什么看起来像是打字错误,a+和-交换?@Yakk AdamNevraumont我这边没有打字错误,我不能说作者是否有打字错误。这似乎是书中的一个打字错误,谢谢你的解释这本书似乎有误,谢谢你的解释
void drawLine(int xa, int ya, int xb, int yb, int color) {
float k = (float)(yb-ya)/(float)(xb-xa);
float d = 2*k - 1
int y = ya;
putPixel(xa, ya, color); // paint the pixel (xa,ya) in color "color"
for (int x = xa+1; x<=xb; x++) {
if (d > 0) {
d += 2*k + 2;
y++;
} else {
d += 2*k;
}
putPixel(x, y, color);
}
}
void drawLine(int xa, int ya, int xb, int yb, int color) {
int dx = xb - xa;
int dy = yb -ya;
int d = (dy<<1) - dx;
int d1 = dy <<1;
int d2 = (dy - dx) << 1;
int y = ya;
putPixel(xa, ya, color); // paint the pixel (xa,ya) in color "color"
for (int x = xa+1; x<=xb; x++) {
if (d > 0) {
d += d2;
y++;
} else {
d += d1;
}
putPixel(x, y, color);
}
}