2016-11-01 8 views
1

나는 flex와 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"와 같은 값을 할당 할 때 실제 값은 그 값에 가깝지만 정확하지는 않습니다. 즉, -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 진수를 볼 때만이 문제를 볼 수 있습니다.