From a1ea1b3193161064b56ae49b223346609bfe7163 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 25 Mar 2012 11:08:48 +0200 Subject: [PATCH] round to next nearest integer for the rise, fall and cross arguments of `measure' Simon Guan reported Bug item #3509528, `Meas goes wrong when put in a while loop' In a .control block a `let' variable was passed to the `measure' command. The value of this variable would have been a plain integer, yet it was converted internally to an internal ascii representation with exponential representation (203 ==> 2.03e2) and then processed by `ft_numparse()' where it was converted back to double floating point. Because the intermediate 2.03 has no exact representation in the space of double floating point numbers this conversion was lossy and resulted in a non-integer value. This non-integer was then truncated towards minus infinity in com_measure yielding an error of -1 This commit implements round to nearest in com_measure2 to avoid the problem. FIXME, the internal intermediate conversion of double floating point machine values to ascii representations must be dropped, or replaced with an exact/lossless ascii representation. (for example GNU printf/scanf %a or 64bit hexadecimal representation) --- src/frontend/com_measure2.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/frontend/com_measure2.c b/src/frontend/com_measure2.c index acd1ec0e6..59705c4ae 100644 --- a/src/frontend/com_measure2.c +++ b/src/frontend/com_measure2.c @@ -296,7 +296,6 @@ int measure_extract_variables( char *line ) * + * ----------------------------------------------------------------- */ - int len ; /* length of string */ int status ; /* return status */ char *item ; /* parsing item */ char *measure ; /* measure keyword */ @@ -332,7 +331,7 @@ int measure_extract_variables( char *line ) variable2 = NULL; if (*line == '=') variable2 = gettok_iv(&line) ; if( variable ){ - len = (int) strlen(item); + size_t len = strlen(item); if( item[len-1] == '=' ){ } else { /* We may have something like V(n1)=1 @@ -1159,15 +1158,15 @@ static int measure_parse_stdParams ( } if(strcasecmp(pName,"RISE")==0) { - meas->m_rise = (int)engVal1; + meas->m_rise = (int)floor(engVal1 + 0.5); meas->m_fall = -1; meas->m_cross = -1; } else if(strcasecmp(pName,"FALL")==0) { - meas->m_fall = (int)engVal1; + meas->m_fall = (int)floor(engVal1 + 0.5); meas->m_rise = -1; meas->m_cross = -1; } else if(strcasecmp(pName,"CROSS")==0) { - meas->m_cross = (int)engVal1; + meas->m_cross = (int)floor(engVal1 + 0.5); meas->m_rise = -1; meas->m_fall = -1; } else if(strcasecmp(pName,"VAL")==0) {