2016-11-01 2 views
1

フレックスとbisonを使用して、テキストだけでなく浮動小数点も含むファイルを読み込みます。すべてがうまくいっているようですが、数値の値が時々変更されることに気付いています。例えば、フレックスのsscanfが入力の値を変更する

-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

floatは、すべての数字を表すことはできません。これは通常32ビットであるため、最大で2に制限されます。異なる番号。 -4.036と-3.92はあなたのプラットフォームでは設定されていません。

<float>は、通常IEEE 754 single-precision binary floating-point format: binary32を使用して符号化され、小数点以下の10進値はまれにしか符号化されません。 「-3.92」のような値を割り当てると、実際に保存される値はそれに近い値になりますが、正確ではない可能性があります。 IOWでは、-3.92からfloatへの変換は、割り当てまたはsscanf()によって正確に行われたわけではありませんでした。有意な桁の一定数(floatため典型的には6)を超えてこれらの値を印刷

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 

は、元の割り当てに一致しないことが期待できます。より深いC投稿については、Printf width specifier to maintain precision of floating-point valueを参照してください。


OPは、一致する桁数の期待値を下げる可能性があります。代わりにdoubleを使用し、15桁以上の10進数を表示する場合にのみ、この問題を参照することもできます。

関連する問題