浮点错误是什么-1.#J是什么意思?

Sre*_*kel 12 c c++ floating-point printf

最近,有时(很少)从我们的应用程序导出数据时,导出日志包含看起来像"-1.#J"的浮点值.我无法重现它所以我不知道浮点数在二进制文件中是什么样的,或者Visual Studio如何显示它.

我试着查看printf的源代码,但没有找到任何东西(不是100%肯定我看了正确的版本虽然...).

我试过谷歌搜索但谷歌抛出任何#,似乎.我找不到任何浮动错误列表.

Tob*_*obi 28

它可以是负无穷大或NaN(不是数字).由于字段上的格式,printf无法区分它们.

我在Visual Studio 2008中尝试了以下代码:

double a = 0.0;
printf("%.3g\n", 1.0 / a);  // +inf
printf("%.3g\n", -1.0 / a); // -inf
printf("%.3g\n", a / a);    //  NaN
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

1.#J
-1.#J
-1.#J
Run Code Online (Sandbox Code Playgroud)

删除.3格式说明符给出:

1.#INF
-1.#INF
-1.#IND
Run Code Online (Sandbox Code Playgroud)

所以很明显0/0给出NaN,-1/0给出负无穷大(NaN,-inf和+ inf是唯一的"错误"浮点数,如果我没记错的话)

  • J是将"数字"IN四舍五入到少一个地方的结果. (14认同)
  • 将NaN和INF转换为带有前导数字和点的代码是恕我直言,这是一个严重错误.在文本文件中最终得到一个数字字段太容易了,可以重新读取(不可否认但是看似合理的解析器)作为值+1或-1,这与打印的值非常不同.把它写成+#INF, - #INF等等会好得多. (3认同)
  • Raymond Chen 更准确地回答了这个问题:http://blogs.msdn.com/b/oldnewthing/archive/2013/02/28/10397976.aspx 感谢@RBerteig。 (2认同)