Loading [MathJax]/extensions/tex2jax.js
Ask Your Question
2

Odčítání double v C

asked Jan 14 '15

elznima1 gravatar image

updated Jan 14 '15

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.

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 (Jan 14 '15)

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

elznima1 (Jan 14 '15)

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

Jan Rubín (Jan 14 '15)
add a comment

2 Answers

Sort by » oldest newest most voted
2

answered Jan 14 '15

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
link

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 (Jan 14 '15)

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 (Jan 14 '15)

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ý (Jan 14 '15)

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 (Jan 14 '15)
add a comment
0

answered Jan 14 '15

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.

link
add a comment

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: Jan 14 '15

Seen: 471 times

Last updated: Jan 14 '15