浮点数末尾的圆点是否表示缺乏精度?

Does the dot in the end of a float suggest lack of precision?

本文关键字:表示 精度 是否 浮点数      更新时间:2023-10-16

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

1232432.
导致此结果的一个操作是:
float result = pow(10, a * 0.1f) / b

,其中a是一个大的负数,大约在-50到-100之间,b通常在1左右。我读过一些关于浮点精度问题的文章。我的问题是,如果后面的点是visual studio的一种方式,告诉我这个数字的精度非常低,即在变量结果中。如果不是,这意味着什么?

今天在工作中出现了这个问题,我记得对于较大的数字有一个问题,所以每次都发生这个问题(这里的"This"是指后面的点)。但我确实记得,当数字是七位数时,它就发生了。这里他们指出浮点数的精度是7位:

c++ Float除法和精度

这就是Visual Studio通过在末尾加一个点来告诉我的东西吗?

我想我找到了!它说"尾数被指定为一个数字序列,后面跟着一个句号"。尾数是什么意思?这在PC上和在DSP上运行代码时会有所不同吗?因为我得到了不同的结果,唯一让我觉得奇怪的是这个周期,因为我不知道它是什么意思。

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

如果您指的是"sig figs"约定,其中"4.0"表示4±0.1,"4.00"表示4±0.01,那么不,在floatdouble中没有这样的概念。数字总是以24或53位有效位(7.22或15.95十进制数字)*存储,而不管实际有多少位是有效的。

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

  • 值为1232432.0,他们修剪了不必要的尾随零,或
  • 所有内容都被四舍五入到7位有效数字(在这种情况下,真值也可能是1232431.5,1232431.625,1232431.75,1232431.875,1232432.125,1232432.25,1232432.375或1232432.5。)

真正的问题是,为什么使用float ?double是C(++)中的"正常"浮点类型,float是内存节省的优化。

& # 42;书呆子们会很快指出异常值,x87 80位中间值等。

精度不是可变的,这只是VS如何格式化它以显示。对于给定的浮点数,精度(或缺少精度)总是恒定的。

您链接到的MSDN页面讨论了源代码中浮点文字的语法。它没有定义你使用的工具显示数字的方式。如果您使用printfstd:cout << ...打印浮点数,语言标准将指定如何打印它。

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

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

如果您看到某些值的末尾是.,而其他值的末尾是一个没有.的十进制数,这听起来像是调试器中的一个奇怪的故障(可能是错误)。

如果你想知道实际的精度是多少,对于IEEE 32位float(现在大多数计算机使用的格式),1232432.0之前和之后的下一个可表示的数字是1232431.8751232432.125。(使用double而不是float可以获得更好的精度)