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

标签 c++ c floating-point printf

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

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

我试过使用谷歌搜索,但谷歌似乎会丢弃任何#。而且我找不到任何 float 错误列表。

最佳答案

它可以是负无穷大或 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 是唯一“错误的” float ,如果我没记错的话)

关于c++ - 浮点错误 -1.#J 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/840081/

相关文章:

c++ - 如何从 initializer_list 初始化二维数组

c++ - 在 C++ 中将类型从参数转换为模板

PHP - 小数点后位置的 floatval 削减?

c++ - 指向成员函数的函数指针

C 程序 : how to parse csv string using a loop?

c - 如何追加一个数组?

C:整数打印不正确

c - 浮点运算结果如何舍入?

c++ - 对于包含无效值的数据集,我应该使用 float 的NaN还是 float + bool?

c++ - 我可以在 CMakeLists 中使用在工具链文件中定义的 CMAKE_SYSTEM_PROCESSOR 吗?