相关疑难解决方法(0)

浮动和双重比较最有效的方法是什么?

比较两个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)

似乎浪费处理.

有谁知道更聪明的浮动比较器?

c++ algorithm floating-point optimization

495
推荐指数
13
解决办法
39万
查看次数

圆线段碰撞检测算法?

我有一条从A到B的线和一条位于C的圆,半径为R.

图片

用于检查线是否与圆相交的好算法是什么?它沿圆圈边缘的坐标发生了什么?

algorithm math geometry collision-detection line

191
推荐指数
8
解决办法
14万
查看次数

将System.Double与'0'(数字,int?)进行比较的正确方法

对不起,这可能是一个简单的愚蠢问题,但我需要知道确定.

我有这个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# compare

82
推荐指数
5
解决办法
8万
查看次数

C#的浮点比较函数

有人可以在C#中指向(或显示)一些好的通用浮点比较函数来比较浮点值吗?我想实现的功能IsEqual,IsGreater一个IsLess.我也只关心双打不漂浮.

.net c# floating-point

65
推荐指数
7
解决办法
9万
查看次数

比较C#中的double值

我有一个double名为的变量x.在代码中,x获取一个值,0.1我在'if'语句中检查它,比较x0.1

if (x==0.1)
{
----
}
Run Code Online (Sandbox Code Playgroud)

不幸的是它没有进入if声明

  1. 我应该使用Doubledouble

  2. 这背后的原因是什么?你能为此建议一个解决方案吗?

.net c# double

59
推荐指数
6
解决办法
9万
查看次数

为什么float.Epsilon而不是零?

在下面的代码中,为什么与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)

c# floating-accuracy unity-game-engine

33
推荐指数
1
解决办法
2万
查看次数

C#Decimal.Epsilon

为什么Decimal数据类型没有Epsilon字段?

从手册中,decimal值的范围是±1.0×10e-28到±7.9×10e28.

描述Double.Epsilon:

表示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具有与其他实值类型类似的接口.

.net c# decimal epsilon

32
推荐指数
1
解决办法
5623
查看次数

为什么将double.epsilon添加到一个值会产生相同的值,完全相同?

我有一个单元测试,测试边界:

[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)

c# double unit-testing epsilon double-precision

21
推荐指数
2
解决办法
2027
查看次数

机器epsilon的使用是否适合浮点相等测试?

这是测试浮点值相等性的后续行动:"精度"常量是否有标准名称?.对于平等,
有一个非常相似的问题Double.Epsilon,大于,小于,小于或等于,大于或等于.


众所周知,对两个浮点值xy的相等测试应该看起来更像这样(而不是简单的=):

abs(x - y)< epsilon   ,其中epsilon是一个非常小的值.

如何为epsilon选择一个值?

显然最好选择epsilon尽可能小的值,以获得相等性检查的最高精度.

例如,.NET框架提供一个常量System.Double.Epsilon(= 4.94066×10 -324),表示System.Double大于零的最小正值.

但是,事实证明这个特定值不能可靠地用作epsilon,因为:

0 + System.Double.Epsilon≠0

1 + System.Double.Epsilon= 1(!)

也就是说,如果我理解正确,因为该常数小于机器epsilon.

→这是对的吗?

→这是否也意味着我可以可靠地使用epsilon:= machine epsilon进行相等测试?

删除了这两个问题,因为它们已经与上面提到的第二个SO问题得到了充分的回答.


链接到维基百科的文章说,对于64位浮点数(即double许多语言中的类型),机器epsilon等于:

2 -53,或约.0.000000000000000111(小数点后15个零的数字)

→是否遵循这一点,所有64位浮点值保证精确到14(如果不是15)数字?

language-agnostic floating-point precision epsilon

11
推荐指数
3
解决办法
3244
查看次数

使用Contains方法检查List <float>中的float时的C#精度

我有一个floats 列表,并想检查它是否已包含该List.Contains()方法的特定值.我知道,对于float相等测试,你经常不能使用==类似的东西myFloat - value < 0.001.

我的问题是,该Contains方法是否解释了这一点,或者我是否需要使用一种方法来解决float精度错误,以便测试浮点数是否在列表中?

c# contains list floating-accuracy

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