什么浮点值使sprintf_s()产生"1.#QO"?

Jon*_*age 18 c format floating-point printf visual-studio-2008

我有一些(遗留嵌入式c)代码,它通过一些sprintf调用生成.csv文件.偶尔我会看到的价值观1.#QO.我尝试过复制这些值的条件应该给出负无穷大,正无穷大和NaN,但它们似乎都没有给我神奇的1.#QO结果.那么产生这种价值的是什么呢?

......是的,我知道数学中出现了明显的问题,产生了这个价值,但理解它的意义将有助于调试工作.

[编辑1]进行转换的实际行是:

sprintf_s(txt, CSV_HEADER_SIZE, "%.3f", value);
Run Code Online (Sandbox Code Playgroud)

哪里:

#define CSV_HEADER_SIZE (100)
char txt[CSV_HEADER_SIZE];
Run Code Online (Sandbox Code Playgroud)

我正在使用MS Visual Studio 2008进行编译.

[编辑2]更多挖掘节目0xFFFFFFFF给出-1.#QO:

unsigned int i = 0xFFFFFFFF;
float* f = (float*)&i;
printf("%.3f", *f); // gives -1.#QO
Run Code Online (Sandbox Code Playgroud)

..并在Visual Studio调试器中-1.#QNAN00查看它将其扩展为所以看起来这可能是Microsoft特定的表示形式NaN

Fre*_*urk 11

"-1.#QO"在小数点后3位后"舍入"后为"-1.#QNAN".N轮到O为'A'> ='5'和'N'+ 1 =='O'.

这与你的调试器显示"-1.#QNAN00"的原因类似,因为它打印7个位置并在末尾添加填充零.

QNaN 安静的NaN.

  • 最后一个字符是一个字母 (`O`) 而不是零 (`0`)。我认为它会将 `N` 舍入为 `O`,因为如果你使用 `%.2f` 你会得到 `-1.#R` :-) (2认同)