Ask Your Question
2

Odčítání double v C

asked 2015-01-14 12:04:15 +0100

elznima1 gravatar image

updated 2015-01-14 13:31:45 +0100

Jan Rubín gravatar image

Asi by to měla být základní znalost, avšak nějak mi to stále uniká...

Inicializace:

double d = 4.5 - 4.5F;

double dd = 4.7 - 4.7F;

Výstup po printf("d %2.20f\n dd %2.20f\n", d,dd); je:

  d 0.00000000000000000000

 dd 0.00000019073486345889

Chápu, že nemůžu floaty/doubly porovnávat stejně jako celá čísla, avšak u tohoto příkladu asi nechápu proč se toto děje.

edit retag flag offensive close delete

Comments

Je to tím, že 4.7 má v binární soustavě nekonečný periodický rozvoj, kdežto 4.5 ne. Proto ti tam vzniká zaokrouhlovací chyba.

Jan Rubín ( 2015-01-14 13:10:53 +0100 )edit

Ahá. To je přesně to, co mi unikalo! Děkuji.

elznima1 ( 2015-01-14 13:15:53 +0100 )edit

Ok, přidám to jako odpověď.

Jan Rubín ( 2015-01-14 13:17:26 +0100 )edit

2 Answers

Sort by » oldest newest most voted
2

answered 2015-01-14 12:43:57 +0100

MiB gravatar image

Konstanta 4.7 je typu double (dvojitá přesnost), konstanta 4.7F je typu float (jednoduchá přesnost). Číslo 4,7 se nedá reprezentovat přesně, proto má rozdílnou reprezentaci (přesnost) jako float i double:

printf("%2.20f\n", 4.7);
printf("%2.20f\n", 4.7F);

Vypíše:

4.70000000000000017764
4.69999980926513671875
edit flag offensive delete publish link more

Comments

Takže důvod, proč pro 4.5 to funguje a pro 4.7 ne, je vnitřní reprezentace právě těchto dvou konstant? Jinými slovy je nějaký způsob, jak poznat, že pro nějaké číslo tento zápis dá nulu (jako v případě 4.5) a pro jiné to nulu nedá (jako 4.7)? Samozřejmě bez použití kompilátoru :)

elznima1 ( 2015-01-14 13:14:40 +0100 )edit

to by sis musel převést do binární soustavy. Ale nějak nevidím důvod proč to dělat, stejně se většinou porovnávají proměnné a jelikož nevíš co v nich je, tak stejně to musíš porovnávat stylem fabs(a-b)<00...1

Ondřej Máca ( 2015-01-14 13:20:52 +0100 )edit

Poslední číslice desetinného rozvoje (za des. čárkou) musí být 5 a předposlední 2 nebo 7. To tu vlastnost sice nezaručuje, ale dá se podle toho rychle poznat, že to určitě přesně reprezentovat nepůjde. Jinak samozřejmě převést do dvojkové soustavy a zjistit jestli se zacyklím.

Viktor Chlumský ( 2015-01-14 18:36:40 +0100 )edit

Ondřej Máca: Důvod? Teoretický test PA1. Když to takhle dostaneš do testu a máš rozhodnout, co se stane, když proměnnou 'd' a 'dd' porovnáš s 0, tak nemáš moc na výběr, než si to spočítat na papíře :) Viktor Chlumský: Ahá. Chápu. Děkuji, hezký trik.

elznima1 ( 2015-01-14 19:18:30 +0100 )edit
0

answered 2015-01-14 13:18:23 +0100

Jan Rubín gravatar image

Je to tím, že 4.7 má v binární soustavě nekonečný periodický rozvoj, kdežto 4.5 ne. Proto ti tam vzniká zaokrouhlovací chyba.

edit flag offensive delete publish link more

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2015-01-14 12:04:15 +0100

Seen: 471 times

Last updated: Jan 14 '15