A precisão do ponto flutuante pode depender do segmento?
Eu tenho uma pequena classe de vetor 3D em C # 3.0 com base em struct que usa o dobro como unidade básica.
Um exemplo: o valor y de um vetor é
-20.0 straight
Subtraio um vetor com um valor y de
10.094999999999965
O valor para y que eu esperaria é
-30.094999999999963 (1)
Em vez disso, recebo
-30.094999313354492 (2)
Quando estou fazendo todo o cálculo em um único thread, recebo (1). Também o depurador e o VS-quick watch watch retornam (1). Mas, quando executo algumas iterações em um thread e, em seguida, chamo a função de um thread diferente, o resultado é (2). Agora, o depurador também retorna (2)!
Devemos ter em mente que o .NET JIT pode gravar os valores de volta à memória (site Jon Skeet), o que reduz a precisão de 80 bits (FPU) para 64 bits (duplo). No entanto, a precisão de (2) está muito abaixo disso.
A classe de vetor se parece basicamente com isso
public struct Vector3d
{
private readonly double _x, _y, _z;
...
public static Vector3d operator -(Vector3d v1, Vector3d v2)
{
return new Vector3d(v1._x - v2._x, v1._y - v2._y, v1._z - v2._z);
}
}
O cálculo é tão fácil quanto este
Vector3d pos41 = pos4 - pos1;