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

我有一些(遗留嵌入式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表示?

“ – 。#QO”在小数点后“舍入”3位后为“-1。#QNAN”。 N轮到O为’A’> =’5’和’N’+ 1 ==’O’。

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

QNaN 安静的NaN 。

经过大量的摆弄后,我可以最终确定将4字节的浮点数设置为0x7FFFFFFF并将其传递给sprintf_s ,格式说明符为%.3f ,这就是给我的1.#QO

 const int bufSize = 100; char buf[bufSize]; unsigned int i; float* f = (float*)&i; int retval; i = 0xFFFFFFFF; retval = sprintf_s(buf, bufSize, "%.3f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 7, converted val = -1.#QO retval = sprintf_s(buf, bufSize, "%f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 10, converted val = -1.#QNAN0 i = 0x7FFFFFFF; retval = sprintf_s(buf, bufSize, "%.3f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 6, converted val = 1.#QO retval = sprintf_s(buf, bufSize, "%f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 9, converted val = 1.#QNAN0 

…似乎%.3f格式说明符正在裁剪NAN结果所以应该是1.#QNAN0被砍掉为1.#QO

一个小的谷歌搜索指向除以0错误。 虽然如果是这样的话,我会期待一些不同的东西。 也就是说,它似乎特定于MS / Visual C.

你检查sprintf_s()是否返回了失败? 如果是,则不应使用结果。 由于代码看起来不像你检查过,我认为你应该做那个检查。 实际上,如果你不测试*_s()函数之一的结果,那么你就会遇到麻烦。