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.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)预计将与原始分配不匹配。请参阅 Printf width specifier to maintain precision of floating-point value 了解更深入的 C post。
OP 可能会降低对匹配数字位数的预期。或者可以使用 double
,然后仅在查看通常超过 15 个有效小数位时才会看到此问题。
我正在使用 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.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)预计将与原始分配不匹配。请参阅 Printf width specifier to maintain precision of floating-point value 了解更深入的 C post。
OP 可能会降低对匹配数字位数的预期。或者可以使用 double
,然后仅在查看通常超过 15 个有效小数位时才会看到此问题。