最近,我们的应用程序在导出数据时,偶尔(很少)会出现看起来像“-1.#J”的浮点值。我无法复现它,因此不知道二进制下这个浮点数长什么样子,或者Visual Studio如何显示它。
我尝试查看printf的源代码,但没有找到任何东西(虽然我不确定是否查看了正确的版本...)。
我尝试过搜索引擎,但是搜索引擎似乎会忽略#号。而且我也找不到任何关于浮点错误的列表。
最近,我们的应用程序在导出数据时,偶尔(很少)会出现看起来像“-1.#J”的浮点值。我无法复现它,因此不知道二进制下这个浮点数长什么样子,或者Visual Studio如何显示它。
我尝试查看printf的源代码,但没有找到任何东西(虽然我不确定是否查看了正确的版本...)。
我尝试过搜索引擎,但是搜索引擎似乎会忽略#号。而且我也找不到任何关于浮点错误的列表。
输出结果可能是负无穷大或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是唯一的“错误”浮点数)