浮点数末端的点是否表示缺乏精确度?

时间:2011-12-15 21:34:13

标签: c++ visual-studio floating-point floating-point-precision

当我通过步进代码在VS C ++中调试我的软件时,我注意到一些浮点计算显示为带有尾点的数字,即:

1232432.

导致此结果的一个操作是:

float result = pow(10, a * 0.1f) / b

其中a是-50到-100左右的大负数,b最常见的是1.我读了一些关于浮点数时精度问题的文章。我的问题是,如果尾随点是Visual-Studio方式,告诉我该数字的精度非常低,即在变量结果中。如果不是,那是什么意思?

今天出现了这个问题,我记得大数字存在问题所以每次都会发生这种情况(并且“这个”我指的是尾随点)。但我确实记得它发生在数字中有七位数时。他们在这里怀疑浮点数的精度是七位数:

C++ Float Division and Precision

这可能是事情,Visual Studio通过在最后添加一个点来告诉我这个吗?

我认为我发现了它!它说“尾数被指定为一个数字序列,后跟一个句号”。尾数是什么意思?这可以在PC上以及在DSP上运行代码时有所不同吗?因为事情是我得到了不同的结果,对我来说唯一看起来很奇怪的是这个时期的东西,因为我不知道它意味着什么。

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx

3 个答案:

答案 0 :(得分:3)

精度不是可变的,这就是VS如何格式化显示。对于给定的浮点数,精度(或不足)始终是常量。

答案 1 :(得分:3)

如果你指的是“sig figs”惯例,其中“4.0”表示4±0.1而“4.00”表示4±0.01,那么不,float或{{1}中没有这样的概念}。数字总是*存储24或53个有效位(7.22或15.95十进制数字),无论有多少实际上是“重要”。

尾随点只是一个小数点,后面没有任何数字(这是一个合法的C文字)。它要么意味着

  • 该值为double,他们将不必要的尾随零,OR
  • 分成三等分
  • 所有内容均被舍入为7位有效数字(在这种情况下,真实值也可能是1232431.5,1232431.625,1232431.75,1232431.875,1232432.125,1232432.25,1232432.375或1232432.5。)

真正的问题是,您为什么使用1232432.0float是C(++)中的“普通”浮点类型,double是一种节省内存的优化。

* Pedants将快速指出非正规,x87 80位中间值等。

答案 2 :(得分:1)

您链接的MSDN page在源代码中讨论了浮点文字的语法。它没有定义您使用的任何工具如何显示数字。如果使用printfstd:cout << ...打印浮点数,则语言标准会指定如何打印浮点数。

如果你在调试器中打印它(这似乎是你正在做的),它将以调试器的开发人员决定的任何方式进行格式化。

可以通过多种不同的方式显示给定的浮点数:1.01.10.0E-001.1e+1都表示完全相同事情。尾随.通常不会告诉您有关精度的任何信息。我的猜测是调试器的开发人员只使用1232432.而不是1232432.0来节省空间。

如果你看到一些值的尾随.和其他人没有.的十进制数,那听起来就像调试器中的一个奇怪的故障(可能是一个bug)。

如果您想知道实际精度是多少,对于IEEE 32位float(大多数计算机目前使用的格式),1232432.0之前和之后的下一个可表示的数字是{{1 }和1232431.875。 (使用1232432.125而不是double,您将获得更好的精确度。)