当我通过步进代码在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
答案 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 真正的问题是,您为什么使用1232432.0
? float
是C(++)中的“普通”浮点类型,double
是一种节省内存的优化。
* Pedants将快速指出非正规,x87 80位中间值等。
答案 2 :(得分:1)
您链接的MSDN page在源代码中讨论了浮点文字的语法。它没有定义您使用的任何工具如何显示数字。如果使用printf
或std:cout << ...
打印浮点数,则语言标准会指定如何打印浮点数。
如果你在调试器中打印它(这似乎是你正在做的),它将以调试器的开发人员决定的任何方式进行格式化。
可以通过多种不同的方式显示给定的浮点数:1.0
,1.
,10.0E-001
和.1e+1
都表示完全相同事情。尾随.
通常不会告诉您有关精度的任何信息。我的猜测是调试器的开发人员只使用1232432.
而不是1232432.0
来节省空间。
如果你看到一些值的尾随.
和其他人没有.
的十进制数,那听起来就像调试器中的一个奇怪的故障(可能是一个bug)。
如果您想知道实际精度是多少,对于IEEE 32位float
(大多数计算机目前使用的格式),1232432.0
之前和之后的下一个可表示的数字是{{1 }和1232431.875
。 (使用1232432.125
而不是double
,您将获得更好的精确度。)