【发布时间】:2011-05-09 16:10:34
【问题描述】:
我有一些(遗留的嵌入式 c)代码通过一些 sprintf 调用生成一个 .csv 文件。偶尔我会看到1.#QO 的值。我尝试使用应该给出负无穷大、正无穷大和 NaN 的条件来重现这些值,但它们似乎都没有给我带来神奇的 1.#QO 结果。那么是什么产生了这个价值呢?
...是的,我知道产生该值的数学显然有问题,但理解它的含义将有助于调试工作。
[编辑 1] 进行转换的实际行是:
sprintf_s(txt, CSV_HEADER_SIZE, "%.3f", value);
地点:
#define CSV_HEADER_SIZE (100)
char txt[CSV_HEADER_SIZE];
我正在使用 MS Visual Studio 2008 进行编译。
[编辑 2] 更多挖掘显示0xFFFFFFFF 给出-1.#QO:
unsigned int i = 0xFFFFFFFF;
float* f = (float*)&i;
printf("%.3f", *f); // gives -1.#QO
..在 Visual Studio 调试器中查看它会将其扩展为 -1.#QNAN00,所以看起来这可能是 NaN 的 Microsoft 特定表示?
【问题讨论】:
-
有问题的
sprintf()行是什么? -
你能找出产生这个结果的值之一,并格式化出底层的浮点数据,比如十六进制吗?例如,如果它是 4 字节浮点数,您可以使用
printf("%X", value),或者对于 8 字节浮点数,您可以使用printf("%llX", value),具体取决于平台。这些信息会很有帮助。 -
您能否识别编译器(以及,如果适用,运行时)?我上次查看的那个特定的
sprintf输出不在标准中,所以它可能非常依赖于实现。 -
我认为 0xFFFFFFFF 是 NaN 的 IEEE-754 标准表示 - 但是该数字的奇怪打印似乎是 Microsoft 特有的。此外,你可以从除以零中得到这个是有道理的。此处讨论 IEEE 754 NaN:en.wikipedia.org/wiki/NaN
-
另外,请参阅维基百科文章中关于 qNaN(安静、非信号 NaN)的注释
标签: c visual-studio-2008 format floating-point printf