2011-12-15 135 views
4

我有一个用Microsoft Visual C++ 6.0编写的应用程序。现在我已经使用C#重写了Visual Studio 2010中的应用程序,但由于精度问题导致结果不匹配。其中一个精确问题是以下问题之一。Visual Studio 2010的精确问题

float a = 1.0f; 

float b = 3.0f; 

float c = a/b; 

这是当在Visual Studio 2010运行C#代码给出c值= 0.333333343

但同样的代码,在值的定义,当上运行值之后去除˚F的Visual C++ 6.0给出C值= 0.333333

任何人都可以对它进行排序并解释如何在visual Studio以及Visual C++ 6.0中为c赋予相同的值?


实际上这些值取自监视窗口。我开始知道不同版本的Visual Studio在浮点格式表示上可能会有所不同。因此,手表中的值可能没有用处。这就是为什么我在两个visual studio版本中都打印了值的原因,结果如下所示。 与Visual Studio 6.0使用Visual C++语言是0.333333(6个3的)

但使用C#语言的Visual Studio 10是0.3333333(7个3的)

所以任何人可以帮助我,使我的C#程序产生与Visual C++相同的结果? (即我怎样才能使浮动操作产生相同的结果在这两个版本?)

+2

您是如何看待这些值的?我很确定内部表示是相同的(除非我错了,C#在后台使用`double'),但向用户显示数字的方法不同,因此您可以简单地查看不同的显示默认值。 – 2011-12-15 12:37:06

+0

@MrLister C#4.0规范在第4.1.6节中说,浮点数上的二进制运算“使用*至少* float类型和精度”(强调增加)来执行。所以幕后精度是由实现定义的。 .NET Framework可能在幕后使用双打。 – phoog 2011-12-28 18:29:26

回答

15

鉴于确切的价值是0.3重复,他们都没有“正确” - 如果你试图匹配确切二进制浮点计算的结果,这通常是一个坏主意,由于他们的工作方式。 (请参阅我的文章binary floating point in .NET一些更多的信息。)

这是可能,你不应该使用在第一位二进制浮点来(例如,如果你的价值观代表确切,人工数额如金钱)。或者,您可能只应该使用特定容差进行平等比较。

有可能是C#和C生产完全相同的位模式 - 但你看到的,因为如何将这些价值观正在格式化不同的结果。再次,我不会使用数字的文本表示进行比较。

5

C#只显示较少的小数位。 0.333333343四舍五入为有效数字为0.333333c的基础值是相同的。

当然,如果你想要更高的精度,你总是可以使用double变量。

3

C#浮点可以通过floatdouble类型来处理。 A float类型有7位数的精度和double 16.

我相信C++标准精度约为16位数(平均15.9!)。

在任何情况下,由于1/3是0.333重复,因此这两种表示都不是算术上正确的。

我认为它只是您看到的值的表示(请注意,调试器会将该值转换为显示的字符串,如果您检查每个存储器的位置,您可能会发现值

1

快速检查显示是的,数字是完全一样的。所以你的问题的答案是,当你想要相同的输出,你所需要做的就是确保显示方法兼容。
例如,C中的printf("%9.7f", result)和C#中的string.Format("{0:0.0000000}", result)。就这样。