sscanf在flex中改变输入值

时间:2016-11-01 14:14:46

标签: flex-lexer scanf

我正在使用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文件,浮动时会显示所描述的值。并非所有值都会更改,即使相同的值在某些情况下也会更改,而在其他情况下也会保持不变。

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

1 个答案:

答案 0 :(得分:1)

float不能代表每个数字。它通常是32位,因此限制为至多2个 32 不同的数字。 -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)可能会与原始分配不匹配。有关更深入的C帖子,请参阅Printf width specifier to maintain precision of floating-point value

OP可以降低对多少位数匹配的预期。或者可以使用double,然后只有在查看超过15个有效十进制数字时才会看到此问题。