sscanf in flex 改变输入值

sscanf in flex changing value of input

我正在使用 flex 和 bison 读取包含文本和浮点数的文件。一切似乎都运行良好,只是我注意到它有时会改变数字的值。例如,

-4.036 is (sometimes) becoming -4.0359998, and 
-3.92  is (sometimes) becoming -3.9200001

.l 文件正在使用行

static float fvalue ;

sscanf(specctra_dsn_file_yytext, "%f", &fvalue) ;

这些值通过 yacc 解析器并到达我自己的 .cpp 文件,作为带有描述值的浮点数。并不是所有的值都改变了,甚至同一个值在某些情况下发生了变化,而在其他情况下则没有变化。

如果我需要添加更多信息,请告诉我。

float不能代表每一个数字。它通常是 32 位的,因此最多只能有 232 个不同的数字。 -4.036 和 -3.92 不在您平台上的那个集合中。

<float> 通常使用 IEEE 754 single-precision binary floating-point format: binary32 进行编码,很少对小数位的十进制值进行精确编码。当分配像“-3.92”这样的值时,实际保存的值将接近于该值,但可能不准确。 IOWs,-3.92float 的转换不是通过赋值或 sscanf().

完成的
float x1 = -3.92;
// float has an exact value of -3.9200000762939453125
// View @ 6 significant digits -3.92000
// OP reported                 -3.9200001

float x2 = -4.036;
// float has an exact value of -4.035999774932861328125
// View @ 6 significant digits -4.03600
// OP reported                 -4.0359998

将这些值打印到超过一定数量的有效小数位(对于 float,通常为 6)预计将与原始分配不匹配。请参阅 Printf width specifier to maintain precision of floating-point value 了解更深入的 C post。


OP 可能会降低对匹配数字位数的预期。或者可以使用 double,然后仅在查看通常超过 15 个有效小数位时才会看到此问题。