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

14

最近,我们的应用程序在导出数据时,偶尔(很少)会出现看起来像“-1.#J”的浮点值。我无法复现它,因此不知道二进制下这个浮点数长什么样子,或者Visual Studio如何显示它。

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

我尝试过搜索引擎,但是搜索引擎似乎会忽略#号。而且我也找不到任何关于浮点错误的列表。


参见:https://dev59.com/VFXTa4cB1Zd3GeqP5-EA#5542066 - Martin York
1个回答

29

输出结果可能是负无穷大或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

这导致以下输出:

1.#J
-1.#J
-1.#J

去掉 .3 格式说明符后结果如下:

1.#INF
-1.#INF
-1.#IND

很明显,0/0的结果是NaN,而-1/0的结果是负无穷(如果我没记错的话,NaN、-inf和+inf是唯一的“错误”浮点数)


15
J是将“数字”IN四舍五入到比原来低一位的结果。 - RBerteig
3
将NaN和INF翻译为带有前导数字和小数点的代码,我认为是一个很大的错误。这样很容易在文本文件中得到一个数值字段,它可以被重新读取(虽然不完美但仍然有可能),并解释成+1或-1,这与打印出的值非常不同。最好将其写为+#INF、-#INF等。 - RBerteig
还有负无穷大! - tc.
对于 VS 2012,将“1#I”四舍五入为“1#J”发生在_fptostr的第87行。 - Trout.Z
3
雷蒙德·陈更准确地回答了这个问题:http://blogs.msdn.com/b/oldnewthing/archive/2013/02/28/10397976.aspx 衷心感谢@RBerteig。 - Ed S.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接