我有问题。 我正在计算opengl渲染的一些点的位置。 但是计算是错误的,并且在渲染图像上产生一个像素重叠。 这是一个严重的问题,因为它看起来很讨厌。 最奇怪的是,简单的添加就会发生错误。
我只是为每一行和每列添加0.02,而且无处可出现0,009。 它来自哪里? 我试图将编译器从arm7更改为arm,但它没有帮助
代码:
for (int i=0;i<elem;i++)
{
LOGE("ROW: %d",i);
startPosX = -(float)elem*vertSize/2.0f + vertSize/2.0f;
for (int j=0;j<elem;j++)
{
LOGE("Column: %d",j);
LOGE("x: %f y: %f vs:%f",startPosX,startPosY,vertSize);
Vvertices[((i*elem*3)+j*3+0)] = startPosX;
Vvertices[((i*elem*3)+j*3+1)] = startPosY;
Vvertices[((i*elem*3)+j*3+2)] = z;
positions[i*elem+j].Set( startPosX, startPosY, z );
if(randomType)
velocity[i*elem+j].Set(getRandom()/speed,getRandom()/speed,getRandom()/speed);
else
velocity[i*elem+j].Set(0.0f,0.1f/speed,0.0f);
startPosX+=vertSize;
}
startPosY +=vertSize;
}
专栏:85 x:0.710000 y:0.989999 vs:0.020000
专栏:86 x:0.729999 y:0.989999 vs:0.020000
答案 0 :(得分:1)
当您需要确保数学计算的精度时,使用诸如float之类的类型有时是个坏主意,因为许多数字在二进制中没有有限表示,就像一些分数没有十进制的有限表示一样。
此问题与数字的机器表示有关,而与您自己使用的编程语言无关。使用float和double类型的典型方法的许多语言都有这个问题。
在Java中,人们使用BigDecimal等类来处理这类问题。