Jaké je správné vyhodnocení funkce "real_to_string()"?
(1/1)
Ondřej Va:
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.
Ondřej Va:
Je to drobnost, ale i v hodnotě "Main.str_2", bych na konci očekával ...414
Zdeněk Pernica:
Čí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.
Navigace
[0] Index zpráv