Diskuse Elektrika.cz

HYBRIDNÍ zóna => Technická podpora výrobce TECO Kolín radí odborníkům => Téma založeno: Ondřej Va 05.09.2018, 18:55



Název: Jaké je správné vyhodnocení funkce "real_to_string()"?
Přispěvatel: Ondřej Va 05.09.2018, 18:55
Mám pochybnosti o správnosti vyhodnocení funkce "real_to_string()".

Následující program v Tecomatu:
PROGRAM prgMain
  VAR_INPUT
  END_VAR
  VAR_OUTPUT
  END_VAR
  VAR
     x_1    : real  := 6657.19;
     x_2    : lreal;
     x_3    : lreal := 6657.19;
     str_1  : string;
     str_2  : string;
     str_3  : string;
  END_VAR
  VAR_TEMP
  END_VAR

  str_1 := real_to_string( x_1 );

  x_2   := real_to_lreal( x_1 );
  str_2 := lreal_to_strin g( x_2 );

  str_3 := lreal_to_strin g( x_3 );

END_PROGRAM

Vrací hodnoty v datovém oknu:
Main.x_1      REAL    +6657.19
Main.x_2      LREAL   +6657.1899414
Main.x_3      LREAL   +6657.19
Main.str_1    STRING  '6657.189941'
Main.str_2    STRING  '6657.189941'
Main.str_3    STRING  '6657.190000'

Hodnota "Main.str_1" není správná!

Mosaic verze 2018.1
Tecomat CP-1004 v10.5
Stejné výsledky dává i běh v simulátoru.



Název: Re: Funkce "real_to_string()" ?
Přispěvatel: Ondřej Va 05.09.2018, 19:15
Je to drobnost, ale i v hodnotě "Main.str_2",  bych na konci očekával ...414


Název: Re: Jaké je správné vyhodnocení funkce "real_to_string()"?
Přispěvatel: Zdeněk Pernica 07.09.2018, 13:41
Číslo 6657.19 má ve dvojkové soustavě nekonečný periodický rozvoj a při jeho uložení do paměti nutně musí dojít k nějakému zaokrouhlení a ztrátě informace.

6657.19 = (1 + 256119/409600) x 2^12

je uloženo jako:
REAL: 6657.189941406 25
LREAL: 6657.189999999 99959982233121 991

Takže všechny hodnoty jsou "správně" jen každá zaokrouhlena na jiný počet číslic.