Tag: 浮点

Hashcode实现双精度

我之前已经问了一个关于这个课程的问题,但这里又是一个问题。 我创建了一个Complex类: public class Complex { public double Real { get; set; } public double Imaginary { get; set; } } 我正在实现Equals和Hashcode函数,而Equal函数考虑了一定的精度。 我使用以下逻辑: public override bool Equals(object obj) { //Some default null checkint etc here, the next code is all that matters. return Math.Abs(complex.Imaginary – Imaginary) <= 0.00001 && Math.Abs(complex.Real – Real) <= 0.00001; } […]

表达式和指定对象之间的浮点不一致

这让我感到惊讶 – 同样的算法会根据其执行方式给出不同的结果: > 0.1f+0.2f==0.3f False > var z = 0.3f; > 0.1f+0.2f==z True > 0.1f+0.2f==(dynamic)0.3f True (在Linqpad中测试过) 这是怎么回事? 编辑 :我理解为什么浮点运算是不精确的,但不是为什么它会不一致 。 古老的C可靠地证实0.1 + 0.2 == 0.3适用于单精度浮点数,但不适用于双精度浮点数。

可以在不同的处理器上计算浮点数吗? (+在C#和C之间传递双倍数)

我有一个用C#编写的应用程序,它也会调用一些C代码。 C#代码获取一些双重作为输入,对其执行一些计算,将其传递给在其上执行自己计算的本机层,然后传递回C#层。 如果我在不同的机器上运行相同的exe / dll(所有这些都是英特尔的x64),我可能得到的最终结果会在不同的机器上有所不同吗?

使用ToString(“F1”)时浮点的舍入不正确

我有一个浮动值:12345.6489 我使用时格式化: (12345.6489f)的ToString( “F1”) 然后我得到了结果 12345.7 但这是不正确的,因为它应该是12345.6。 有谁知道为什么会这样? 另一个提示是在格式化之前转换为double会返回正确的结果,如果我的浮点值稍微小一些,例如1234.6489,那么我也得到正确的结果。

数学解释为什么Decimal的转换为Double并且Decimal.GetHashCode将相等的实例分开

我不确定这种说明Stack Overflow问题的非标准方式是好还是坏,但是这里有: 什么是最好的(数学或其他技术)解释为什么代码: static void Main() { decimal[] arr = { 42m, 42.0m, 42.00m, 42.000m, 42.0000m, 42.00000m, 42.000000m, 42.0000000m, 42.00000000m, 42.000000000m, 42.0000000000m, 42.00000000000m, 42.000000000000m, 42.0000000000000m, 42.00000000000000m, 42.000000000000000m, 42.0000000000000000m, 42.00000000000000000m, 42.000000000000000000m, 42.0000000000000000000m, 42.00000000000000000000m, 42.000000000000000000000m, 42.0000000000000000000000m, 42.00000000000000000000000m, 42.000000000000000000000000m, 42.0000000000000000000000000m, 42.00000000000000000000000000m, 42.000000000000000000000000000m, }; foreach (var m in arr) { Console.WriteLine(string.Format(CultureInfo.InvariantCulture, “{0,-32}{1,-20:R}{2:X8}”, m, (double)m, m.GetHashCode() )); } Console.WriteLine(“Funny consequences:”); […]

规范化音频,如何将float数组转换为字节数组?

大家好,我正在播放音频文件。 我把它读作byte[]然后我需要通过将值放入[-1,1]的范围来规范化音频。 我想将每个浮点值放入byte[i]数组中,然后将该byte[]放回播放音频播放器。 我试过这个: byte[] data = ar.ReadData(); byte[] temp=new byte[data.Length]; float biggest= 0; ; for (int i = 0; i biggest) { biggest= data[i]; } } 这部分代码应该举例如0.43 int byte []如果可能的话我试过这个但是它不起作用: for (int i = 0; i < data.Length; i++) { temp = BitConverter.GetBytes(data[i] * (1 / biggest)); }

双精度值无法正确表示哪些值

Double数据类型无法正确表示某些基数10的值。 这是因为浮点数代表实数。 这意味着当表示货币值时,应该使用十进制值类型来防止错误。 (随意更正此序言中的错误) 我想知道的是,在标准.Net框架下64位架构下的双数据类型下出现这样一个问题的值是什么(C#如果有所不同)? 我希望答案是一个公式或规则来找到这样的值,但我也想要一些示例值。

C#中的浮点数是否有良好的radixsort实现?

我有一个带有float类型字段的数据结构。 这些结构的集合需要按浮点数的值进行排序。 是否有基数排序实现。 如果没有,是否有快速访问指数,符号和尾数的方法。 因为如果你最后一次在尾数,指数和指数上对浮点数进行排序。 你在O(n)中排序浮点数。

与浮点数不一致的乘法性能

在.NET中测试浮点数的性能时,我偶然发现了一个奇怪的情况:对于某些值,乘法似乎比正常慢。 以下是测试用例: using System; using System.Diagnostics; namespace NumericPerfTestCSharp { class Program { static void Main() { Benchmark(() => float32Multiply(0.1f), “\nfloat32Multiply(0.1f)”); Benchmark(() => float32Multiply(0.9f), “\nfloat32Multiply(0.9f)”); Benchmark(() => float32Multiply(0.99f), “\nfloat32Multiply(0.99f)”); Benchmark(() => float32Multiply(0.999f), “\nfloat32Multiply(0.999f)”); Benchmark(() => float32Multiply(1f), “\nfloat32Multiply(1f)”); } static void float32Multiply(float param) { float n = 1000f; for (int i = 0; i < 1000000; ++i) […]

标准浮点数的0到1之间有多少个唯一值?

我想另一种表达这个问题的方法是使用只能在0和1之间的float小数位数吗? 我试着通过查看MSDN来解决这个问题。 其中精度为7位数。 我认为这意味着它只能跟踪0.0000001变化。 但是,如果我这样做: float test = 0.00000000000000000000000000000000000000000001f; Console.WriteLine(test); 它写出了9.949219E-44 如果我再添加零,它将输出0 。 我很确定我在这里遗漏了一些东西,因为这种准确度似乎非常错误。 主要是浮点数为32位,在该精度水平上仅为0-1,包含1e + 44个可能的数字……