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. |