浮点错误 -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 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中float是啥意思

java里Jfarm是啥意思

C++:构建选项“-j”是啥意思?

if any(j != " " for j in i): 是啥意思?

在python中//是啥意思?

JAVA中,返回值是啥意思?