Tag: 浮点精度

将float转换为UInt32 – 哪个表达式更精确

我有一个float x ,它应该在范围内,但它经过几次数值运算 – 结果可能略微超出。 我需要使用整个UInt32范围将此结果转换为uint y 。 当然,我需要在范围内钳制x并进行缩放。 但是哪种操作顺序更好? y = (uint)round(min(max(x, 0.0F), 1.0F) * UInt32.MaxValue) 要么 y = (uint)round(min(max(x * UInt32.MaxValue, 0.0F), UInt32.MaxValue) 换句话说,最好先缩放,然后钳制OR钳位然后缩放? 我在IEEE浮点表示中不是很深刻,但我相信上述表达式的计算顺序有所不同。

C#的任何等效“扩展”?

我正在研究我的Mandelbrot屏幕保护程序的新版本,并且我的浮点精确度已经不足了 – 简单的双值没有足够的重要数据来满足我的需求。 更重要的数字=更大程度的放大分形 回到我在Delphi 7中编写这个屏幕保护程序的版本时,我使用了80位大小的扩展浮点类型。 在.NET中,我可以切换到十进制 ,但是这对性能的影响非常糟糕,分形生成速度减慢了20倍左右。 是否有任何相当于.NET的扩展 ? 或者,是否有任何数字类型的精度高于double仍然使用FPU进行评估,因此不具有十进制的高性能命中? 更新 我的屏幕保护程序已经设法缩放许多(很多!)数量级的分形; 目前,只有当使用的数字类型无法分隔相邻像素的纵坐标时,它才会重置为基础分形。 从双倍扩展的改进中额外的16位精度将使我接近16倍的大小倍增。 至于性能,我的算法已经设法消除了所需数学的95-99%(与计算许多像素的简单实现相比),同时保留了分形的完整性。

在c#中接受浮点不准确有什么好处?

在过去的 几天里,我脑子里已经遇到了这个问题,我很难说出我的问题。 但是,我想我已经固定了我想知道的东西。 为什么c#通过使用浮点来存储数据来接受不准确? 使用它比其他方法有什么好处? 例如, Math.Pow(Math.Sqrt(2),2)在c#中并不精确。 有些编程语言可以精确计算它(例如,Mathematica)。 我能想到的一个论点是,计算它确实比仅仅应对不准确要慢得多,但Mathematica和Matlab用于计算巨大的科学问题,所以我发现很难相信这些语言真的比c#慢得多。 那么为什么呢? PS:我很抱歉用这些问题向你发送垃圾邮件,你们都非常乐于助人

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

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

c#string to float conversion无效?

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

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

我在C#3.0中有一个基于struct的小型3D矢量类,它使用double作为基本单元。 一个例子:一个向量的y值是 -20.0 straight 我减去y值为的向量 10.094999999999965 y我期望的价值是 -30.094999999999963 (1) 相反,我得到了 -30.094999313354492 (2) 当我在一个单独的线程中进行整个计算时,我得到(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); } } 计算就像这样容易 […]

获得下一个最小的双号

作为unit testing的一部分,我需要测试一些边界条件。 一种方法接受System.Double参数。 有没有办法获得下一个最小的双值? (即将尾数减1个单位值)? 我考虑使用Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 – Double.Epsilon == 9999999999 )。 那么所需的算法或代码是什么: NextSmallest(Double d) < d ……总是如此。