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;

questionAnswers(1)

yourAnswerToTheQuestion