比较两个double或两个float值的最有效方法是什么?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
Run Code Online (Sandbox Code Playgroud)
但是像这样:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
我有一条从A到B的线和一条位于C的圆,半径为R.

用于检查线是否与圆相交的好算法是什么?它沿圆圈边缘的坐标发生了什么?
对不起,这可能是一个简单的愚蠢问题,但我需要知道确定.
我有这个if表达,
void Foo()
{
System.Double something = GetSomething();
if (something == 0) //Comparison of floating point numbers with equality
// operator. Possible loss of precision while rounding value
{}
}
Run Code Online (Sandbox Code Playgroud)
这个表达是否与...相等
void Foo()
{
System.Double something = GetSomething();
if (something < 1)
{}
}
Run Code Online (Sandbox Code Playgroud)
?因为那时我可能会遇到问题,输入if例如0.9的值.
有人可以在C#中指向(或显示)一些好的通用浮点比较函数来比较浮点值吗?我想实现的功能IsEqual,IsGreater一个IsLess.我也只关心双打不漂浮.
我有一个double名为的变量x.在代码中,x获取一个值,0.1我在'if'语句中检查它,比较x和0.1
if (x==0.1)
{
----
}
Run Code Online (Sandbox Code Playgroud)
不幸的是它没有进入if声明
我应该使用Double或double?
这背后的原因是什么?你能为此建议一个解决方案吗?
在下面的代码中,为什么与float.Epsilon进行比较而不是0?
// Coroutine to move elements
protected IEnumerator SmoothMovement (Vector3 end)
{
// Distance computation
float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
while(sqrRemainingDistance > float.Epsilon)
{
Vector3 newPostion = Vector3.MoveTowards(
rb2D.position, end, inverseMoveTime * Time.deltaTime
);
rb2D.MovePosition (newPostion);
sqrRemainingDistance = (transform.position - end).sqrMagnitude;
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud) 为什么Decimal数据类型没有Epsilon字段?
从手册中,decimal值的范围是±1.0×10e-28到±7.9×10e28.
表示
Double大于零的最小正值
所以看起来,Decimal也有这样一个(非平凡的)价值.但为什么不容易获得?
我明白+1.0×10e-28正是最小的正十进制值大于零:
decimal Decimal_Epsilon = new decimal(1, 0, 0, false, 28); //1e-28m;
Run Code Online (Sandbox Code Playgroud)
顺便提一下,有几个问题可以提供有关Decimal数据类型内部表示的信息:
这是一个Epsilon有用的例子.
假设我从一些采样集和所采样本的权重(或计数)之和得到加权值.现在我想计算加权平均值.但我知道权重(或计数)的总和可能仍为零.为了防止除零,我可以做if... else...并检查零.或者我可以像这样写:
T weighted_mean = weighted_sum / (weighted_count + T.Epsilon)
Run Code Online (Sandbox Code Playgroud)
这个代码在我看来更短.或者,或者我可以跳过+ T.Epsilon,而是初始化:
T weighted_count = T.Epsilon;
Run Code Online (Sandbox Code Playgroud)
当我知道实际权重的值永远不会接近时,我就能做到这一点Epsilon.
对于某些数据类型和用例,这可能更快,因为它不涉及分支.据我所知,即使分支很短,处理器也无法将两个分支用于计算.我可能知道零点以50%的速率随机出现:=)对于Decimal,速度方面可能并不重要,甚至在第一种情况下也没有用.
我的代码可能是通用的(例如,生成的),我不想为小数写单独的代码.因此,人们希望看到它Decimal具有与其他实值类型类似的接口.
我有一个单元测试,测试边界:
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void CreateExtent_InvalidTop_ShouldThrowArgumentOutOfRangeException()
{
var invalidTop = 90.0 + Double.Epsilon;
new Extent(invalidTop, 0.0, 0.0, 0.0);
}
public static readonly double MAX_LAT = 90.0;
public Extent(double top, double right, double bottom, double left)
{
if (top > GeoConstants.MAX_LAT)
throw new ArgumentOutOfRangeException("top"); // not hit
}
Run Code Online (Sandbox Code Playgroud)
我以为我只是通过添加最小可能的正双倍来向尖端90.0倾斜,但现在异常没有被抛出,任何想法为什么?
在调试时,我看到top为90,当它应该是90.00000000 ....
编辑:
我应该考虑更难,90+Double.Epsilon将失去其解决方案.似乎最好的方法是做一些转移.
解:
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void CreateExtent_InvalidTop_ShouldThrowArgumentOutOfRangeException()
{
var invalidTop = Utility.IncrementTiny(90); // 90.000000000000014
// var sameAsEpsilon = Utility.IncrementTiny(0);
new Extent(invalidTop, 0, 0, 0);
}
/// <summary> …Run Code Online (Sandbox Code Playgroud) 这是测试浮点值相等性的后续行动:"精度"常量是否有标准名称?.对于平等,
有一个非常相似的问题Double.Epsilon,大于,小于,小于或等于,大于或等于.
众所周知,对两个浮点值x和y的相等测试应该看起来更像这样(而不是简单的=):
abs(x - y)< epsilon ,其中epsilon是一个非常小的值.
如何为epsilon选择一个值?
显然最好选择epsilon尽可能小的值,以获得相等性检查的最高精度.
例如,.NET框架提供一个常量System.Double.Epsilon(= 4.94066×10 -324),表示System.Double大于零的最小正值.
但是,事实证明这个特定值不能可靠地用作epsilon,因为:
0 +
System.Double.Epsilon≠01 +
System.Double.Epsilon= 1(!)
也就是说,如果我理解正确,因为该常数小于机器epsilon.
→这是对的吗?
→这是否也意味着我可以可靠地使用epsilon:= machine epsilon进行相等测试?
删除了这两个问题,因为它们已经与上面提到的第二个SO问题得到了充分的回答.
链接到维基百科的文章说,对于64位浮点数(即double许多语言中的类型),机器epsilon等于:
2 -53,或约.0.000000000000000111(小数点后15个零的数字)
→是否遵循这一点,所有64位浮点值保证精确到14(如果不是15)数字?
我有一个floats 列表,并想检查它是否已包含该List.Contains()方法的特定值.我知道,对于float相等测试,你经常不能使用==类似的东西myFloat - value < 0.001.
我的问题是,该Contains方法是否解释了这一点,或者我是否需要使用一种方法来解决float精度错误,以便测试浮点数是否在列表中?