Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/CPP-将浮点算术转换为整数算术 我有以下C++函数(实现),见于_C++_C_Algorithm_Floating Point_Integer - Fatal编程技术网

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
    是否大于0
  • 将2dy/dx+2添加到
    d
  • 将2dy/dx添加到
    d
  • 在浮点运算中,被dx除可能产生一个非整数。为了避免这种情况,我们通过将所有值乘以dx来转换操作,得到:

  • d
    初始化为2dy−dx
  • 评估
    d
    是否大于0dx(等于0)
  • 将2dy+2dx添加到
    d
  • 将2dy添加到
    d

  • 我们可以很容易地看到,除了3之外,这四个等价的操作都是在整数代码中实现的。整数代码显示为添加2dy−2dx到
    d
    。整数代码与中显示的代码匹配。我怀疑浮点版本中的
    +
    是本书中的一个错误。

    浮点代码对
    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
    是否大于0dx(等于0)
  • 将2dy+2dx添加到
    d
  • 将2dy添加到
    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);
        }
    }