我正在使用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文件,浮动时会显示所描述的值。并非所有值都会更改,即使相同的值在某些情况下也会更改,而在其他情况下也会保持不变。
如果我要添加更多信息,请告诉我。
答案 0 :(得分:1)
float
不能代表每个数字。它通常是32位,因此限制为至多2个 32 不同的数字。 -4.036和-3.92不在您的平台上。
<float>
通常使用IEEE 754 single-precision binary floating-point format: binary32进行编码,并且很少精确地编码小数十进制值。当分配像“-3.92”这样的值时,保存的实际值将接近于该值,但可能不准确。 IOWs,-3.92
到float
的转换并不是完全由转让或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。
double
,然后只有在查看超过15个有效十进制数字时才会看到此问题。