Sziasztok.
Adott néhány ezer tizedes tört. Kerekíteni szeretném őket oly módon, hogy ez legyen a követendő példa az 5-re végződőeknél:
0.5 --> 0
1.5 --> 2
2.5 --> 2
3.5 --> 4
4.5 --> 4
5.5 --> 6
és ne ez:
0.5 --> 1
1.5 --> 2
2.5 --> 3
3.5 --> 4
4.5 --> 5
5.5 --> 6
Kérésem az, hogy míg utóbbinál, a felfelé kerekítés elve megy, az első verziónál valóban egyenlő valószínűséggel tudom felfelé és lefelé kerekíteni a számokat? Cél az, hogy a kerekített számok összegzésekor minél közelebbi érték legyen az eredetihez.
Másképp megfogalmazva:
a számhalmazból random módon kiválasztok 5000-et, majd kerekítés nélkül összeadom, ez legyen A.
Ezután a kerekített értékeket is összeadom, ez legyen B.
A és B különbségének abszolút értéke legyen minél közelebb a nullához, ez lenne a cél. Kérdés: Melyik kerekítés a hatásosabb, a felfelé kerekítés, vagy a másik?
Megjegyzés:
A nem 5-re végződő számok esetében a felfelé- és lefelé kerekítés hagyományos módszerei volnának.
- 4595 megtekintés
Hozzászólások
"egyenlő valószínűséggel tudom felfelé és lefelé kerekíteni a számokat"
A kérdést sem értem.
- A hozzászóláshoz be kell jelentkezni
0,1,2,3,4: lefelé kerekítesz
5,6,7,8,9: felfelé kerekítesz.
Ez 50%.
Ha ebbe belenyúlsz, akkor csalsz, hamisítasz.
- A hozzászóláshoz be kell jelentkezni
Banker's rounding.
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Érdekes, hogy a bankszakmában is vannak kerekítések. Természetesen biztosra veszem, hogy nem a javamra.
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Ráadásul pont az amit te A-ként leírtál. ;)
- A hozzászóláshoz be kell jelentkezni
C# alapértelmezésként így kerekít decimal típusú változóknál.
- A hozzászóláshoz be kell jelentkezni
Pontosbítsunk:
0 -> nem kell kerekíteni
1,2,3,4 -> lefelé kerekítünk, mert az van közelebb
5 -> gondolkodóba esünk, mert pont középen van
6,7,8,9 -> felfelé kerekítünk, mert az van közelebb
az 5 dilemmájára valóban az a szokásos eljárás, hogy párosra kerekítünk: [5.5,6.5]->6, (6.5,7.5)->7
(a szögletes zárójel zárt, a kerek nyílt intervallumot jelent)
Szerk: óvatosságból a 'szokásos eljárás' kifejezést cseréljük le arra, hogy 'egyik elterjedt eljárás' vagy arra, hogy 'ésszerűnek tűnő eljárás'
- A hozzászóláshoz be kell jelentkezni
Konkrétan az érdekelne, hogy valóban bizonyított-e, hogy ez tényleg pontosabb értéket ad-e. Bizonyára igen, a fene vigye el, ma találkoztam ezzel először. (Szégyen...)
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Nem látszik bonyolultnak... Nyilván csak az .5 re végződő számok az érdekesek, azokból is egy elég szűk intervallum elég lehet, pl -2.5,-1.5,..,+2.5,+3.5
Kerekítetlen összeg: 3.5
"Mindig le" kerekítés után összeg: 0
"Mindig fel": 7
"Párosra" kerekítés után összeg: 5
"Páratlanra": 2
A hibát oszthatjuk a darabszámmal, a lényegen nem változtat: a "párosra" és a "páratlanra" algoritmus pontosabb eredményt ad, mint a "mindig le" és a "mindig fel".
- A hozzászóláshoz be kell jelentkezni
"Nyilván csak az .5 re végződő számok az érdekesek"
Nem nyilván, de ja, a többi kerekítés hibája 0-összegû.
- A hozzászóláshoz be kell jelentkezni
0: ez nem kerekítés.
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
A magyar iskolában tanítanak egyfajta kerekítést, de nem mondják el, hogy van tucatnyi egyéb kerekítési algoritmus is. Mindegyiknek másfajta előnye van, és nincs köztük olyan, amit az egyetlen hivatalosnak lehetne nevezni.
- A hozzászóláshoz be kell jelentkezni
Igen.
Ami nálam megszokott, azt pl. a tengeri navigációban használják.
Szerencsére az nem a bankszektor...
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Ha a normal kerekitest hasznalod, akkor a kerekitett elemek osszegenek varhato erteke megegyezik a nem kerekitett elemek osszegevel.
A masodik kerekitesnel:
tegyuk fel, hogy egy elem p esellyel vegzodik 5-re. Ezeket fele-fele aranyban jol, illetve lefele kerekited, tehat az osszeg varhato erteke 0.5 * p * x -el kevesebb lesz, ahol x az elemek szama. Ha a szamok eloszlasa uniform, es csak egy tizedesjegyed van, akkor p = 0.1, ket tizedesjegynel p = 0.01, stb.
Tehat ha |A-B| minimalizalasa a cel, akkor az eredeti kerekitest hasznald.
Szerk: a varhato ertek egy kicsit nagyobb az eredeti kerekitessel, ezt ellensulyozza a masodik kerekites.
- A hozzászóláshoz be kell jelentkezni
A szisztematikus hibát valóban csökkenti imp javaslata. De a véletlenből adódó elmozdulását az átlagnak nem.
Ha olyan szabály szerint kerekítesz, ami nem veszi figyelembe a többi számot, akkor mindenképpen lesz egy véletlenszerű faktorod, ami egy véletlenszerű bolyongást fog jelenteni az összegben. Tehát az eredeti összegtől egyre nagyobb szórással kerülsz egyre messzebb.
Egy megoldás lehet, ha a kerekítések során számolod, hogy eddig mennyit "csalt el" a kerekítés, és annak megfelelően korrigálod a kerekítés szabályait. Vagy akár csak mindig hozzáadod a hibát a következő számhoz.
Ha pontosan számolod, akkor pontosan ugyanaz marad az összeg.
Egy kicsit "igazságosabb" megoldás, ha úgy lövöd be a kerekítés határát, hogy pont ugyanaz legyen az összeg. Ennek viszont "kicsit" költségesebb az algoritmusa.
- A hozzászóláshoz be kell jelentkezni
C-ben a rint(), lrint(), nearbyint() nem ezt csinálja megfelelő fesetround() beállítás esetén?
- A hozzászóláshoz be kell jelentkezni
Páros felé kerekítesz. Csak nem földmérő vagy? (A két távcsőállásban mért szögek középértékét a páros szám felé kerekítettük, mert állítólag könnyebb volt vele számolni a függvénytáblázat meg tekerős számológép idejében)
[ Falu.me ]
- A hozzászóláshoz be kell jelentkezni
Ez az ún. round-half-to-even kerekítés, aíi IEEE-754-ben alapértelmezés.
https://en.wikipedia.org/wiki/IEEE_floating_point#Rounding_rules
- A hozzászóláshoz be kell jelentkezni