包含双精度和整数的错误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
和castc
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();
}