Tag: 浮点

根据给定的精度评估两个双精度是否相等,而不是在一定的固定公差范围内

我正在运行NUnit测试来评估一些已知的测试数据和计算结果。 这些数字是浮点数的双倍数,所以我不指望它们完全相等,但我不确定如何将它们视为对于给定的精度相等。 在NUnit中,我们可以与固定的容差进行比较: double expected = 0.389842845321551d; double actual = 0.38984284532155145d; // really comes from a data import Expect(actual, EqualTo(expected).Within(0.000000000000001)); 并且对于零以下的数字工作正常,但随着数字的增加,公差确实需要改变,因此我们始终关注相同的精度位数。 具体来说,此测试失败: double expected = 1.95346834136148d; double actual = 1.9534683413614817d; // really comes from a data import Expect(actual, EqualTo(expected).Within(0.000000000000001)); 当然,更大的数字会因公差而失败。 double expected = 1632.4587642911599d; double actual = 1632.4587642911633d; // really comes from a data import […]

为什么C#允许* Long隐式*从Long转换为Float,这可能会失去精度?

一个类似的问题Long in Float,为什么? 这里没有回答我在寻找的东西。 C#标准允许从long到float的隐式转换。 但任何长于2 ^ 24的长度在表示为浮动时必然会失去其“价值”。 C#标准清楚地表明,长期浮动转换可能会失去“精确度”但永远不会失去“幅度”。 我的问题是 关于积分类型,“精确”和“幅度”的含义。 数字n与数字n + 1完全不同,与实数不同,其中3.333333和3.333329可能被认为足够接近计算(即取决于程序员想要的精度) 不允许隐式转换从long到浮动邀请到微妙的错误,因为它可能导致长期“默默地”失去价值(作为一个C#程序员,我习惯于编译器在防范这些问题方面做得非常出色) 那么C#语言设计团队允许这种转换是隐含的理由是什么呢? 我在这里失踪的是什么certificate从长期到浮动的隐性转换是正确的?

c#string to float conversion无效?

var x = dr[“NationalTotal”].ToString(); 给了我333333333 var xxx = Convert.ToSingle(dr[“NationalTotal”].ToString()); 给了我333333344 有什么想法吗?

为什么我的号码被错误地舍入?

这感觉就像那种只在现场失败的代码,但我会尝试将其改编成代表我所看到的代码片段。 float f = myFloat * myConstInt; /* Where myFloat==13.45, and myConstInt==20 */ int i = (int)f; int i2 = (int)(myFloat * myConstInt); 单步执行代码后,i == 269,i2 == 268。 这里有什么可以解释这个差异?

使用float时为什么会得到错误的结果?

可能重复: 为什么(双)0.6f>(双)(6 / 10f)? 为什么C#中的浮点运算不精确? 我在C#中有以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StackOverflow { class Program { static void Main(string[] args) { float num1 = 17.03F; float num2 = 17F; float result = num1 – num2; Console.WriteLine(result); } } } 代码工作正常,但我没有得到预期的结果。 有人可以解释为什么会这样吗?

将double转换为float而不使用Infinity

我使用旧的float myFloat = (float)myDouble将double转换为float。 然而,这有时会导致“无限”,这对我正在进行的进一步处理不利。 只要它指向一般方向作为原始数字(我要转换的所有数字的相对数量’强度’必须保持),我对损失没问题。 如何将float转换为double并避免Infinity? 背景: 我正在从wav / mic读取字节流,将其转换为float ,将其转换为double ,通过FFT计算运行(这需要double ),现在我想让它恢复float (将数据存储在32位中)图像容器)。

如何以2个字节保存浮点数?

是的我知道IEEE-754半精度标准,是的,我知道在该领域所做的工作。 简单地说,我试图在2个字节中保存一个简单的浮点数(如52.1或1.25 )。 我已尝试过Java和C#中的一些实现,但它们通过解码不同的数字来破坏输入值。 你输入32.1 ,编码解码后得到32.0985 。 有没有什么方法可以在不破坏输入值的情况下以16位存储浮点数? 非常感谢。

如何检测浮点数在C#中是否有重复的十进制扩展?

我只需要知道如何在浮点数中检测重复的十进制扩展。 例: 0.123456789123456789 该数字的重复部分为123456789。 我想用C#自动化这个,有没有智能解决方案?

经验法则来测试C#中两个双打的相等性?

假设我有一些代码可以执行一些浮点运算并将值存储在双精度数中。 由于某些值无法以二进制forms完美表示,如何在合理程度的确定性下测试相等性? 我如何确定“合理”是什么意思? 可以double.Epsilon以某种方式使用? 更新 几件事。 正如@ ho1指出的那样,double.Epsilon的文档指出,当比较两个双精度表示相等时,你可能想要一个远大于epsilon的值。 以下是文档中的相关段落: 由于其最低有效位数的差异,两个明显等效的浮点数可能无法相等。 例如,C#表达式(double)1/3 ==(double)0.33333,不比较相等,因为左侧的除法运算具有最大精度,而右侧的常量仅精确到指定的数字。 如果创建一个自定义算法来确定是否可以将两个浮点数视为相等,则必须使用大于Epsilon常量的值来确定可接受的两个值的绝对差值,以使两个值相等。 (通常,差异的差异比Epsilon大很多倍 。) – http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx ……但问题是,要多少倍? 如果它会影响你的答案,我的特殊情况涉及几何计算(例如使用点和向量的点积和交叉积)。 在某些情况下,根据A == B , A > B或A < B得出不同的结论,所以我正在寻找一个如何确定等价窗口大小的好经验法则。

“(float)integer == integer”在C#中是否保证相等?

虽然“我们都知道” x == y可能有问题,但x和y是浮点值,这个问题更具体一些: int x = random.Next(SOME_UPPER_LIMIT); float r = x; // Is the following ALWAYS true? r == x 现在,因为float的范围远大于整数的范围(但是精度不足以在边缘处唯一地呈现整数),如果对这个问题的回答也解决了上述x的哪个值可以得到保证将会很好因为,如果它可以得到保证。 目前我的代码正在做出这个假设(对于相对较小的x值) – 我想确保我不会被咬掉:) 这将失败,“不等于:16777217”(cast float – > int): for (int i = 0; i < int.MaxValue; i++) { float f = i; if ((int)f != i) throw new Exception("not equal " + i); […]