相关疑难解决方法(0)

我在哪里可以找到C#中的机器epsilon?

机器epsilon被规范地定义为添加到一个的最小数字,给出不同于一个的结果.

有一个Double.Epsilon但名称非常具有误导性:它是可表示的最小(非规范化)Double值,因此对任何类型的数字编程都是无用的.

我想获得该类型的真正 epsilon Double,以便不必将容差硬编码到我的程序中.我该怎么做呢 ?

.net c# numerical-methods

15
推荐指数
2
解决办法
4807
查看次数

浮点精度可以依赖于线程吗?

我在C#3.0中有一个基于struct的小型3D矢量类,它使用double作为基本单元.

一个例子:一个向量的y值是

-20.0 straight
Run Code Online (Sandbox Code Playgroud)

我减去一个y值为的向量

10.094999999999965
Run Code Online (Sandbox Code Playgroud)

y我期望的价值是

-30.094999999999963         (1)
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

-30.094999313354492         (2)
Run Code Online (Sandbox Code Playgroud)

当我在一个单独的线程中进行整个计算时,我得到(1).调试器和VS快速监视器也会返回(1).但是,当我在一个线程中运行几次迭代然后从另一个线程调用该函数时,结果是(2).现在,调试器也返回(2)!

我们必须记住.NET JIT可能会将值写回内存(网站Jon Skeet),这会将精度从80位(FPU)降低到64位(双倍).但是,(2)的准确性远低于此.

vector类看起来基本上都是这样的

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);
  }  
}
Run Code Online (Sandbox Code Playgroud)

计算就像这样容易

Vector3d pos41 = pos4 - pos1;
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading floating-accuracy

6
推荐指数
1
解决办法
606
查看次数