Portál AbcLinuxu, 10. května 2025 02:02

Dotaz: C(++), Bash, Python, Ruby: Přesnost na desetinná místa

David Watzke avatar 14.2.2006 22:12 David Watzke | skóre: 74 | blog: Blog... | Praha
C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Přečteno: 1918×
Odpovědět | Admin
Ahoj. Chtěl bych se zeptat jak v jazycích C(++), Bash, Python a Ruby počítat s přesností na desetinná místa (abych si mohl vybrat kolik těch míst). Všechny tyto jazyky defaultně zaokrouhlují a ještě k tomu blbě... :-)

Bash
$ expr 5 / 2
2
Python
>>> 5 / 2
2
atd...

Díky.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.2.2006 22:20 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nemá tě to rádo :-)
>>> 5.0 / 2.0
2.5
Copak toho není dost?
David Watzke avatar 14.2.2006 22:29 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Bože.. tohle mě fakt nenapadlo. Jako s tím sleepem tenkrát... Omlouvá mě to, jak šíleně jsem ospalej? ;-)

No díky :-) Python máme zdá se v kapse.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
14.2.2006 22:24 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
V C je odpověď jasná: printf("%.4f", 5.0 / 2.0); V bashi použij bc (před cca týdnem o něm vyšel článek na rootu). Ruby a Python nepoužívám.
Užívej dne – možná je tvůj poslední.
David Watzke avatar 14.2.2006 22:35 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Děkuju, přečtu si to :-)
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
14.2.2006 22:28 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud vám nebude stačit přesnost typu long double, nezbyde buď použít nějakou hotovou knihovnu typu GMP nebo si napsat vlastní implementaci.

Ale z těch vašich příkladů soudím, že pro začátek bude lepší začít dokumentací nebo učebnicí těch jazyků, konkrétně kapitolou o datových typech.

David Watzke avatar 14.2.2006 22:31 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Ale z těch vašich příkladů soudím, ...
K tomu to fakt nepotřebuju :-) Je to fakt jen příklad.

Díky!
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
14.2.2006 22:51 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Asi jste mne nepochopil. Z toho, že se divíte, že '5 / 2' vám vyjde jako 2, a komentujete to, že ten jazyk "zaokrouhluje a ještě špatně", vyplývá, že máte velmi nepřesnou představu o tom, jak je ten výraz vyhodnocován. A to byste si měl ve vlastním zájmu doplnit, pokud to s programováním myslíte vážně.
David Watzke avatar 14.2.2006 22:57 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Myslím to vážně. A doplním. Bylo mi jasný, že to nebude tak jednoduchý... ale skutečně jsem se domníval, že se pokouší zaokrouhlovat.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
4.9.2007 12:30 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Ano, vím, že komentuju 566 dní starý dotaz ;-), ale stejně si dovolím - pro úplnost - doplnit:
ruby -rmathn -e 'puts 5/2'
5/2
ruby -rmathn -e 'puts 225054544/55655613 + 856564/4545547'
82359123216100/19460400361947
Zlomky (s čitateli a jmenovateli libovolné délky) nám rozhodně nechybí. :-)
14.9.2007 12:09 Petr Mach | skóre: 9 | blog: Hláska
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Součástí pythonu je knihovna/modul decimal pro přesná desetinná místa. Řeší problém zaokrouhlování způsobený binární soustavou, která neumí například přesně vyjádřit číslo 0,1 stejně jako desítková soustava neumí přesně vyjádřit 1/3.
David Watzke avatar 14.2.2006 22:54 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro úplnost, Ruby funguje podobně jako Python:
$ ruby -e 'print 5.0 / 2.2'
2.27272727272727
$ python -c 'print 5.0 / 2.2'
2.27272727273
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
14.2.2006 22:57 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Když se všechny tyhle jazyky chovají stejně, vyvstává otázka, totiž, čím to? ;-)
Copak toho není dost?
14.2.2006 23:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
To bude na beton nějaké porušení Intellectual Property… :-)
5.9.2007 07:37 Ouplnej anonym
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Všechny jazyky nééé:
01 DELENI
  02 PRVNI-CLEN		PIC 999V99.
  02 DRUHY-CLEN		PIC 999V99.
  02 VYSLEDEK		PIC 999V99.

...

PROCEDURE DIVISION.
MAIN-000.
...
  MOVE 5 TO PRVNI-CLEN.
  MOVE 2 TO DRUHY-CLEN.
  DIVIDE PRVNI-CLEN BY DRUHY-CLEN GIVING VYSLEDEK.
...

Kód jsem netestoval, nemám tu překladač ;-)
14.2.2006 22:57 barney
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
no, v C (a C++) kompilátor určuje typ ako "najmenší možný".
takže 5 je int (signed), a teda aj delenie je celočíselné.

bash to má popísané priamo v manuáli
tie dve zlátaniny na(ne)štastie nemam nainštalované :-))
zaujímavé, v perli je to hned 2.5 :-)

14.2.2006 23:16 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
zaujímavé, v perli je to hned 2.5 :-)
Teď teda nevím, jestli to brát jako plus, nebo mínus ... vzhledem k tomu, že Perl moc nemusím ... ;-)
When your hammer is C++, everything begins to look like a thumb.
Josef Kufner avatar 15.2.2006 01:24 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
už vidím, jak perl zkoumá pole a odhaduje dvou a půltý prvek :-D
Hello world ! Segmentation fault (core dumped)
5.9.2007 08:36 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
:-) ak je to ARRAY, tak najprv na index aplikuje funkciu int :-)
na také drobnosti sa myslelo :-)
15.2.2006 01:36 Ritchie | skóre: 27 | blog: Ritchie's | Berlin
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Javascript se chová naprosto stejně hláše se k tomu i v dokumentaci.

1/2 //returns 0.5 in JavaScript
4.9.2007 20:08 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
V bashi nie je problem pocitat s fixnou presnostou. Proste namiesto $((5/2)) spocitas $((500/2)) a mas to na 2 desatinne miesta. A finalne vypisovat trikovo
echo ${premenna%??}.${premenna: -2}
If you hold a Unix shell up to your ear, you can you hear the C.
David Watzke avatar 4.9.2007 20:13 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Jo, za ty dva roky jsem se leccos naučil... :-)

Místo ${premenna%??} je zde lepší použít ${premenna:0:1} (první číslo je od kolikátýho znaku a druhý kolik znaků).
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
5.9.2007 00:12 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Jo, za ty dva roky jsem se leccos naučil... :-)

Tak v tom smelo pokracuj :-)

Ako chces inak vypisat vsetky znaky premennej okrem poslednych 2 (v pripade pocitania na 2 desatinne miesta)? Pretoze dopredu nevies ako je premenna dlha, vies iba dlzku desatinnej casti.
If you hold a Unix shell up to your ear, you can you hear the C.
David Watzke avatar 5.9.2007 15:00 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Jo, máš pravdu - jsem hlupák :-) Jak je proměnná dlouhá není problém ${#zjistit}, ale to je v tomhle případě zbytečný. To je tak, když člověk dělá chytrýho.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
5.9.2007 12:16 Jooky (inactive) | skóre: 39 | blog: Jooky | Bratislava
Rozbalit Rozbalit vše Re: C(++), Bash, Python, Ruby: Přesnost na desetinná místa
Odpovědět | | Sbalit | Link | Blokovat | Admin
Všechny tyto jazyky defaultně zaokrouhlují a ještě k tomu blbě... :-)
Neni to zaokruhlovanie ale delenie zo zvyskom!
$ expr 5 / 2
2
$ expr 5 % 2
1
Cize 5 deleno 2 je 2 a zvysok 1 (uplne normalna matika ;o).

V C(++) staci ked su cisla v niecom co ma desatinne miesta (fload, double) alebo to pretipujes pred delenim.
V bashi je mozne pouzit napr. bc.
$ echo "5/2" | bc -l
2.50000000000000000000
$
Ostatne moc nepoznam.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.