EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  <20082009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  <20082009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: A bug of calc record?
From: Dirk Zimoch <[email protected]>
To: Tim Mooney <[email protected]>
Cc: tech-talk <[email protected]>
Date: Wed, 03 Dec 2008 17:27:12 +0100
Hi Geyang,

One should generally avoid to accumulate floating point values which have an
infinite number digits in dual representation, such as 0.1 or 0.2. It is like
adding 0.3333 instead of 1/3 in decimal. Integer values are much better for
counting than floats.

Floating point values are very bad in:
* accumulating small numbers to a large sum
* subtracting two numbers with a small difference
* deciding if two numbers are equal

Adding and subtracting is much more sensitive to rounding errors than
multiplying and dividing.

Dirk

Tim Mooney wrote:
> This is not actually a problem. 1.38777878078145e-16 is an excellent
> approximation to the desired value of zero, and an excellent approximation
> is the best you can ever hope for, with finite-precision arithmetic.
> You're accumulating round-off error each time you add or subtract 0.1.
> You could set PREC to, say, 6, and clients would only show 6 digits
> of the result.  (I don't know right off if dbpr honors PREC, but it's
> just a diagnostic routine, so it won't usually matter.)
> 
> Silver wrote:
>> hi, all:
>>
>> I am trying to use the record suggested by Ned Arnold. It's good work when
>> increment is 1. but when I change to 0.1, it has a strange problem. the db
>> file is like following:
>>
>> record(ai, "$(user):aiExample") { field(DESC, "Analog input") field(INP,
>> "$(user):calcExample.VAL  NPP NMS") } record(calc, "$(user):calcExample") { 
>> field(DESC, "Counter") field(SCAN,"1 second") field(FLNK,
>> "$(user):aiExample") field(CALC, "A-B>0?A>=0.9?0.8:A+0.1:A<0.1?0.1:A-0.1") 
>> field(INPA, "$(user):calcExample.VAL  NPP NMS") field(INPB,
>> "$(user):calcExample.LA NPP NMS") field(EGU, "Counts") }
>>
>> Following is dbtr message, we can see when the value change to 0.1, after
>> caculation, it's value change to VAL: 1.38777878078145e-16, can anyone give
>> some suggestion? thanks a lot in advance.
>>
>> epics> dbtr tcl:calcExample A: 0.2              ACKS: NO_ALARM      ACKT: YES
>> ADEL: 0 ALST: 0.1           ASG:                B: 0.3              BKPT:
>> 0x00 C: 0                CALC: A-B>0?A>=0.9?0.8:A+0.1:A<0.1?0.1:A-0.1
>>  D: 0                DESC: Counter       DISA: 0             DISP: 0
>>  DISS: NO_ALARM      DISV: 1             DTYP: <nil>         E: 0
>>  EGU: Counts         EVNT: 0             F: 0 FLNK:DB_LINK tcl:aiExample
>> G: 0                H: 0 HHSV: NO_ALARM      HIGH: 0             HIHI: 0
>> HOPR: 0 HSV: NO_ALARM       HYST: 0             I: 0 INPA:DB_LINK
>> tcl:calcExample.VAL NPP NMS INPB:DB_LINK tcl:calcExample.LA NPP NMS
>> INPC:CONSTANT       INPD:CONSTANT INPE:CONSTANT       INPF:CONSTANT
>> INPG:CONSTANT       INPH:CONSTANT INPI:CONSTANT       INPJ:CONSTANT
>> INPK:CONSTANT       INPL:CONSTANT J: 0                K: 0                L:
>> 0                LA: 0.2 LALM: 0.1           LB: 0.3             LC: 0
>> LCNT: 0 LD: 0               LE: 0               LF: 0               LG: 0
>>  LH: 0               LI: 0               LJ: 0               LK: 0
>>  LL: 0               LLSV: NO_ALARM      LOLO: 0             LOPR: 0
>>  LOW: 0              LSV: NO_ALARM       MDEL: 0             MLST: 0.1
>>  NAME: tcl:calcExample                   NSEV: NO_ALARM      NSTA: NO_ALARM
>>  PACT: 0             PHAS: 0             PINI: NO            PREC: 0
>>  PRIO: LOW           PROC: 0             PUTF: 0             RPRO: 0
>>  SCAN: 1 second      SDIS:CONSTANT       SEVR: NO_ALARM      STAT: NO_ALARM
>>  TPRO: 0             TSE: 0              TSEL:CONSTANT       UDF: 0
>>  VAL: 0.1 epics> dbtr tcl:calcExample A: 0.1              ACKS: NO_ALARM
>> ACKT: YES           ADEL: 0 ALST: 1.38777878078145e-16              ASG:
>> B: 0.2 BKPT: 0x00          C: 0 CALC: A-B>0?A>=0.9?0.8:A+0.1:A<0.1?0.1:A-0.1
>> D: 0 DESC: Counter       DISA: 0             DISP: 0             DISS:
>> NO_ALARM DISV: 1             DTYP: <nil>         E: 0                EGU:
>> Counts EVNT: 0             F: 0                FLNK:DB_LINK tcl:aiExample
>>  G: 0                H: 0                HHSV: NO_ALARM      HIGH: 0
>>  HIHI: 0             HOPR: 0             HSV: NO_ALARM       HYST: 0
>>  I: 0                INPA:DB_LINK tcl:calcExample.VAL NPP NMS
>>  INPB:DB_LINK tcl:calcExample.LA NPP NMS INPC:CONSTANT       INPD:CONSTANT
>>  INPE:CONSTANT       INPF:CONSTANT       INPG:CONSTANT       INPH:CONSTANT
>>  INPI:CONSTANT       INPJ:CONSTANT       INPK:CONSTANT       INPL:CONSTANT
>>  J: 0                K: 0                L: 0                LA: 0.1
>>  LALM: 1.38777878078145e-16              LB: 0.2             LC: 0
>>  LCNT: 0             LD: 0               LE: 0               LF: 0
>>  LG: 0               LH: 0               LI: 0               LJ: 0
>>  LK: 0               LL: 0               LLSV: NO_ALARM      LOLO: 0
>>  LOPR: 0             LOW: 0              LSV: NO_ALARM       MDEL: 0
>>  MLST: 1.38777878078145e-16              NAME: tcl:calcExample
>>  NSEV: NO_ALARM      NSTA: NO_ALARM      PACT: 0             PHAS: 0
>>  PINI: NO            PREC: 0             PRIO: LOW           PROC: 0
>>  PUTF: 0             RPRO: 0             SCAN: 1 second      SDIS:CONSTANT
>>  SEVR: NO_ALARM      STAT: NO_ALARM      TPRO: 0             TSE: 0
>>  TSEL:CONSTANT       UDF: 0              VAL: 1.38777878078145e-16
>>  epics> dbtr tcl:calcExample A: 1.38777878078145e-16                 ACKS:
>> NO_ALARM      ACKT: YES ADEL: 0             ALST: 0.1           ASG:
>> B: 0.1 BKPT: 0x00          C: 0 CALC: A-B>0?A>=0.9?0.8:A+0.1:A<0.1?0.1:A-0.1
>> D: 0 DESC: Counter       DISA: 0             DISP: 0             DISS:
>> NO_ALARM DISV: 1             DTYP: <nil>         E: 0                EGU:
>> Counts EVNT: 0             F: 0                FLNK:DB_LINK tcl:aiExample
>>  G: 0                H: 0                HHSV: NO_ALARM      HIGH: 0
>>  HIHI: 0             HOPR: 0             HSV: NO_ALARM       HYST: 0
>>  I: 0                INPA:DB_LINK tcl:calcExample.VAL NPP NMS
>>  INPB:DB_LINK tcl:calcExample.LA NPP NMS INPC:CONSTANT       INPD:CONSTANT
>>  INPE:CONSTANT       INPF:CONSTANT       INPG:CONSTANT       INPH:CONSTANT
>>  INPI:CONSTANT       INPJ:CONSTANT       INPK:CONSTANT       INPL:CONSTANT
>>  J: 0                K: 0                L: 0 LA: 1.38777878078145e-16
>> LALM: 0.1           LB: 0.1 LC: 0               LCNT: 0             LD: 0
>> LE: 0 LF: 0               LG: 0               LH: 0               LI: 0
>>  LJ: 0               LK: 0               LL: 0               LLSV: NO_ALARM
>>  LOLO: 0             LOPR: 0             LOW: 0              LSV: NO_ALARM
>>  MDEL: 0             MLST: 0.1           NAME: tcl:calcExample
>>  NSEV: NO_ALARM      NSTA: NO_ALARM      PACT: 0             PHAS: 0
>>  PINI: NO            PREC: 0             PRIO: LOW           PROC: 0
>>  PUTF: 0             RPRO: 0             SCAN: 1 second      SDIS:CONSTANT
>>  SEVR: NO_ALARM      STAT: NO_ALARM      TPRO: 0             TSE: 0
>>  TSEL:CONSTANT       UDF: 0              VAL: 0.1 epics>
>>
>> Best regards Geyang  2008-11-23
>>
>>
> 

-- 
Dr. Dirk Zimoch
Paul Scherrer Institut, WBGB/006
5232 Villigen PSI, Switzerland
Phone +41 56 310 5182

References:
A bug of calc record? Silver
Re: A bug of calc record? Tim Mooney

Navigate by Date:
Prev: Re: compile error about gateway Dirk Zimoch
Next: Records not in Base David Dudley
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  <20082009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: A bug of calc record? Tim Mooney
Next: CSS 1.1.0 Hatje, Jan
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  <20082009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
ANJ, 02 Sep 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·