Avatar
havlat82
Člen
Avatar
havlat82:

ahoj potřeboval bych se na něco zeptat. Mate mě chování překladače FPC 2.6.2 (poslední verze Free Pascalu v Lazaru sem to ještě nezkoušel).
Pokusil sem se přiřadit proměnné typu single max. hodnotu typu extended a očekával sem range check chybu, ale nenastala. Stejně tak mi dovolil přiřadit max. hodnotu extended do proměnné typu double/real. Přitom, když sem se pokusil přiřadit tuto hodnotu do proměnné typu comp a currency, hodilo mi to tu chybu. Neví někdo proč Free Pascal nerozlišuje single/double/real a bereto všechno jako extended? nepoužil sem žádnou unitu, kod sem kompiloval v normálnim debug módu s nastavenou kontrolou rozsahu.

zdroják:

const
Extended_max_hod­nota = 1.1E4932;

var
r1: real;
r2: single;
r3: double;
r4: extended;
r5: comp;
r6: currency;
begin
r3 := extended_max_hod­nota;
end.

 
Odpovědět 21.8.2013 1:28
Avatar
Odpovídá na havlat82
Luboš Běhounek (Satik):

Float proměnné umožňují uložit navíc hodnoty +-nekonečno a NaN, tipoval bych, že když hodnota překročí rozsah typu, tak se tam uloží asi to nekonečno, zkus zkontrolovat, co máš v té proměnné po uložení.

Nahoru Odpovědět 21.8.2013 1:56
:)
Avatar
havlat82
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
havlat82:

ahoj děkuju za radu. vyzkoušel sem to a opravdu mi to hlásí +nekonečno. ale to mi příde stejně zajímavý, protože to nekonečno je přece definovaný v unitě math. no děkuju každopádně, protože mě díky tvý odpovědi napadlo jak vyřešit ten skutečnej problém, kvůli kterýnu sem prováděl ten test přiřazení.

Na to samý sem se zeptal, ještě v diskuzi na community.fre­epascal.org. odpověděl mi Jonas Maebe. Snad nebude vadit pokud se vložim můj překlad jeho odpovědi:

Kontrola rozsahu funguje pouze pro přesné typy. currency a comp jsou zvláštní případy, protože na některých platformách jsou implementovány
unitou floating point (pohyblivá čárka), přesto že mají přesné ohraničení. Kontrola rozsahu nefunguje na typy s desetinným místem.
Je možné nastavit unitu floating point na kontrolu přetečení nebo podtečení, pokud chceš vyjímky v těchto případech.
(http://www.freepascal.org/…ionmask.html)

Měl by si vědět, že "podrazí nohy" velké části kódu (zvlášť pokud použiješ externí C knihovny)

Jonas Maebe, 21 srpen 2013 11:34

Mohl sem něco přeložit špatně tak ještě přikládám originál:

Range checking only works for exact types. currency and comp are special cases because on some platforms they are implemented using
the floating point unit, but they still have exact boundaries. Range checking does not work for floating point types.
You can enable FPU overflow and underflow checking if you want exceptions in those cases
(http://www.freepascal.org/…ionmask.html), but note that this will probably trip up a lot of code
(especially if you use external C libraries).

 
Nahoru Odpovědět 21.8.2013 22:53
Avatar
Odpovídá na havlat82
Luboš Běhounek (Satik):

V Delphi šlo tuším direktivy nastavovat i jen pro části kódu, takže by sis to hlídání mohl zapnout jen pro část kódu, kde to potřebuješ.

Nahoru Odpovědět 21.8.2013 22:59
:)
Avatar
havlat82
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
havlat82:

No to je právě teď můj strop :D. Kondicionály IFDEF, nemám vůbec zmáklý. takže, to budu řešit oddělenejma unitama a až si nastuduju a otestuju ty kondicionály, tak to zkusim použít, jestli to bude fungovat. Moc děkuju.

 
Nahoru Odpovědět 22.8.2013 11:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.