包含双精度和整数的错误C#代码 for(iy=0;iy

包含双精度和整数的错误C#代码 for(iy=0;iy,c#,integer,double,C#,Integer,Double,有人能看到这个代码有什么直接的问题吗? 变量tr和tb的计算值始终为0 如果需要,我很乐意提供更多信息。不要忘记将整数转换为双倍。例如: 您没有给出其他变量的类型-特别是camera.fov_x和camera.fov_y?如果它们都是整数,则初始化angx和angy的行将使用整数算法进行计算 可以通过强制转换其中一个操作数来修复此问题: int * double = double int / double = double double * int = double double / i

有人能看到这个代码有什么直接的问题吗? 变量
tr
tb
的计算值始终为0

如果需要,我很乐意提供更多信息。

不要忘记将整数转换为双倍。例如:
您没有给出其他变量的类型-特别是
camera.fov_x
camera.fov_y
?如果它们都是整数,则初始化
angx
angy
的行将使用整数算法进行计算

可以通过强制转换其中一个操作数来修复此问题:

 int * double = double
 int / double = double
 double * int = double
 double / int = double

 int * int = int
 int / int = int // be carefull here!

 1 / 10 = 0 (not 0.1D)
 10 / 11 = 0 (not 1)
 1D / 10 = 0.1D
 1 / 10D = 0.1D
 1D / 10D = 0.1D
虽然
fovy
fovx
变量已经是双倍的,但这不是问题所在

你能给出一个完整的例子,我们可以自己编译和测试吗

编辑:Koistya Navin的编辑太过分了。一个表达式只需要一个操作数是双精度的,就可以使用双精度算术计算整个表达式。(但它必须是正确的表达式-如果您使用
(a/b)*c
和cast
c
a double,乘法将使用double算术完成,但a/b仍可以作为整数完成。)

以下是适当更改的列表,以确保在任何地方都使用双算术:

double angy = ((double) camera.fov_y / h) * iy;
//出于风格目的,更改了循环以声明变量
对于(int-iy=0;iy
它知道这不是您最初问题的一部分,但使用SetPixel(..)效率不高,如果您计划在光线跟踪引擎中使用它,可能会出现问题


您可能需要使用LockBits()方法,请参阅此方法,并了解更多详细信息。另一种方法是使用“不安全”C#代码访问数据,这允许您使用指向数据的指针。有关更多信息,请参阅,我使用“不安全”获得了~x2的加速代码。

虽然我怀疑问题出在整数运算上,但这一行是一个糟糕的例子:angx已经是一个双精度数了,所以这一行在我看来不是问题所在。(另外,255D是一种更简洁的(双精度)255的写法。)自从我发布以来,我已经改变了几行,但这里是完整的源代码。Program.cs-Classes.cs-miscsfunctions.cs-顺便说一句,我知道整个代码对于它所产生的东西来说是相当过分的,但我的目标是制作一个光线跟踪引擎,所以这就是
ang
位和
camera.fov
位的来源;)
 int * double = double
 int / double = double
 double * int = double
 double / int = double

 int * int = int
 int / int = int // be carefull here!

 1 / 10 = 0 (not 0.1D)
 10 / 11 = 0 (not 1)
 1D / 10 = 0.1D
 1 / 10D = 0.1D
 1D / 10D = 0.1D
double angy = ((double) camera.fov_y / h) * iy;
// Changed loops to declare the variable, for stylistic purposes
for (int iy = 0; iy < h; iy++)
{
    // Changed here - cast camera.fov_y
    double angy = ((double) camera.fov_y / h) * iy;
    for (int ix = 0; ix < w; ix++)
    {
        // Changed here - cast camera.fov_x
        double angx = ((double) camera.fov_x / w) * ix;
        //output[ix,iy].r = (int)Math.Round(255 * (angy / camera.fov_y);
        //output[ix,iy].b = (int)Math.Round(255 * (angy / camera.fov_y); 
        double tr = (angx / camera.fov_x) * 255D;
        double tb = (angy / camera.fov_y) * 255D;
        Console.Write("({0},{1})", Math.Round(tr), Math.Round(tb));

        output.SetPixel(ix, iy, Color.FromArgb(Convert.ToInt32(tr), 
                                               0,
                                               Convert.ToInt32(tb)) );
        Console.Write(".");
    }
    Console.WriteLine();
}