浮点错误 -1.#J 是啥意思?
Posted
技术标签:
【中文标题】浮点错误 -1.#J 是啥意思?【英文标题】:What does floating point error -1.#J mean?浮点错误 -1.#J 是什么意思? 【发布时间】:2009-05-08 14:32:48 【问题描述】:最近,有时(很少)当我们从应用程序导出数据时,导出日志包含看起来像“-1.#J”的浮点值。我无法重现它,所以我不知道浮点数在二进制中是什么样子的,也不知道 Visual Studio 是如何显示它的。
我尝试查看 printf 的源代码,但没有找到任何东西(虽然不是 100% 确定我查看了正确的版本...)。
我试过谷歌搜索,但谷歌似乎丢弃了任何 #。而且我找不到任何浮动错误列表。
【问题讨论】:
另见:***.com/questions/5541975/what-does-1-mean/… 【参考方案1】:它可以是负无穷大或 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 是唯一的“错误”浮点数)
【讨论】:
有趣...我想知道为什么在截断无穷大/NaN 指标时它会以“J”结尾? J 是 IN 的“数字”四舍五入的结果。 将 NaN 和 INF 转换为带有前导数字和点的代码是恕我直言,这是一个严重错误。很容易在文本文件中得到一个可以重新读取的数字字段(诚然,使用不完美但合理的解析器)作为值 +1 或 -1,这与打印的值完全不同。最好把它写成 +#INF、-#INF 等等。 @RBerteig:感谢您指出正在进行的四舍五入...至于格式,C90 似乎对 Infinity 和 NaN 应该如何格式化保持沉默。 C99 规定必须使用诸如“inf”、“-inf”、“nan”(或它们的微小变体)之类的字符串。不幸的是,C99 是 C/C++ 语言规范的混蛋。 Raymond Chen 更准确地回答了这个问题:blogs.msdn.com/b/oldnewthing/archive/2013/02/28/10397976.aspx 感谢@RBerteig。以上是关于浮点错误 -1.#J 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章