Tag: 双精度

C#浮动无限循环

C#(。Net 3.5 SP1)中的以下代码是我机器上的无限循环: for (float i = 0; i < float.MaxValue; i++) ; 它达到了16777216.0和16777216.0 + 1的评估值为16777216.0。 但在这一点上:我+ 1!=我。 这是一些疯狂。 我意识到浮点数的存储方式存在一些不准确之处。 而且我已经读过整数大于2 ^ 24但不能正确存储为浮点数。 上面的代码仍然应该在C#中有效,即使数字无法正确表示。 为什么不起作用? 你可以在double中获得同样的效果,但这需要很长时间。 9007199254740992.0是double的限制。

C ++ / C#与float和double的区别

我们正在将C ++数学库转换为C#。 该库混合使用浮点数和双精度数(有时在它们之间进行转换),我们也试图这样做,以便在C#中获得与C ++中完全相同的结果,但事实certificate这是非常困难的,如果不是不可能的话。 我认为问题是以下一个或多个问题,但我不是专家: 将浮点数转换为double和double转换为浮点数会导致不可预测的结果,并在C ++和C#中以不同方式完成 C ++和C#处理浮点精度的方式不同,它们不能相互模仿 .NET中有一个设置可以使它像C ++一样运行,但我找不到它(都是32位) 有人可以向我解释可能存在的问题,也许可以将我与微软的一些权威文档联系起来,我可以用来帮助解释这种情况以及产生差异的原因吗? 编辑 我们使用的是VC6和.NET4.0 由于NDA,我不能举出计算的例子,但我可以为差异显示一些数字……他们自己可能很无用: 8.085004000000000 (C#) vs. 8.084980000000000 (C++) 8.848165000000000 (C#) vs. 8.848170000000000 (C++) 0.015263214111328 (C#) vs. 0.015263900756836 (C++) 应该指出的是,这些数字包括复杂的问题。 这些是计算结果。

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

我有一个unit testing,测试边界: [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 } 我以为我只是通过添加最小可能的正双倍来向尖端90.0倾斜,但是现在没有抛出exception,任何想法为什么? 调试时,我看到top为90,当它应该是90.00000000 …. 编辑:我应该想一点, 90+Double.Epsilon将失去其分辨率。 似乎最好的方法是做一些转移。 解: […]

模拟在C#中撕掉一个双

我正在使用32位计算机运行,并且我能够确认使用以下代码片段可以快速查看长值。 static void TestTearingLong() { System.Threading.Thread A = new System.Threading.Thread(ThreadA); A.Start(); System.Threading.Thread B = new System.Threading.Thread(ThreadB); B.Start(); } static ulong s_x; static void ThreadA() { int i = 0; while (true) { s_x = (i & 1) == 0 ? 0x0L : 0xaaaabbbbccccddddL; i++; } } static void ThreadB() { while (true) { ulong x […]