Rondigaj eraroj dum transiro

En Bavario, ĝenerala averaĝa noto de \(2{,}33\) atestas taŭgecon por gimnazio \(2{,}34\) ne. Ĉe tiu akra limo, la ordo de du rondigaj operacioj povas determini, sur kiun flankon infano falas. Günther Felbinger diskutas la eblajn konsekvencojn de tiu rondiga efiko en bloga afiŝo . Pro pura intereso, mi mem kalkulis la efikojn trans ĉiuj noto-kombinaĵoj permesitaj en la modelo.


Mia centra demando estas: Kiom ofte frua rondigo al tutaj fakaj notoj kondukas al malsama speco de lerneja kalkulo ol kalkuloj uzantaj nerondigajn fakajn mezumojn? Plue, estus interese vidi kio ŝanĝiĝas se la mezumoj de la individuaj fakoj (kiel sugestite tie) estas komence rondigitaj al nur unu decimala loko.

Laŭ Sekcio 6 de la Bavara Regularo pri Bazlernejoj, la averaĝa noto estas kalkulata el la notoj en la germana, matematiko, kaj ĝeneralaj kaj lokaj studoj. La efektivigaj regularoj specifas la limojn ĝis kaj inkluzive de \(2{,}33\) kaj ĝis kaj inkluzive de \(2{,}66\) . En la sekva kalkulmodelo, ĉiu totala averaĝo estas stumpigita al du decimaloj kaj ne rondigita denove. Tiel, ekzemple...

\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]

Ĉi tio estas decida por la klasifiko: \(2{,}3366\ldots\) ne fariĝas \(2{,}34\) , sed \(2{,}33\) kaj tial ankoraŭ sufiĉas por bazlernejo.

La komenca eniro ilustras fruan rondigon kun la supozitaj fakspecifaj mezvaloroj \(1{,}6\) , \(2{,}6\) , kaj \(2{,}6\) . El ĉi tiuj, la tutaj notoj \(2\) , \(3\) , kaj \(3\) estas unue derivitaj. Ilia mezvaloro estas

\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]

kio signifas, ke la studento ne rajtas je rekta akcepto en bazlernejon. Tamen, sen rondigo al tutaj notoj, la rezulto en la hipoteza ekzemplo estus...

\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]

En la dua ekzemplo, la rondigo funkcias en la kontraŭa direkto: \(2{,}4\) , \(3{,}4\) kaj \(2{,}4\) fariĝas la plennotaj valoroj \(2\) , \(3\) kaj \(2\) , oficiale \(2{,}33\) . La nerondigitaj valoroj, tamen, rezultas en \(2{,}73\) . La ekzemploj klare montras la efikon. Tamen, ili ankoraŭ ne malkaŝas kiom ofte ĝi okazas aŭ kiaj estus la konsekvencoj de malsama rondiga metodo.

Tial, por mia kalkulo mi uzas klaran rezultan spacon. Ĉiu subjekta meznombro povas esti unu el la \(501\) valoroj en ĝi.

\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]

Supozu. Mi egale pesas ĉiujn ordigitajn kombinaĵojn de la germana, matematiko, kaj lokaj kaj ĝeneralaj studoj. Tiel, ekzistas

\[
501^3=125\,751\,501
\]

Kazoj. La modelo estas do nedubebla, sed artefarita: Ĝi supozas egale distribuitajn fakajn averaĝojn, la sendependecon de la tri fakoj, kaj paŝojn de precize centono. Ĝi ne reflektas la faktan distribuon de bavaraj bazlernejaj infanoj.

Por tri subjektaj mezumoj \(d,m,h\) ni skribas

\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]

por la totala averaĝo stumpigita al du decimalaj ciferoj. Nun ni komparas tri kalkulmetodojn.:

\[
\begin{aligned}
A_0 &= A(\operatorname{rondo}(d),\operatorname{rondo}(m),\operatorname{rondo}(h)),\\
A_1 &= A(\operatorname{rondo}_1(d),\operatorname{rondo}_1(m),\operatorname{rondo}_1(h)),\\
A_\mathrm{ref} & = A(d, m, h).
\end{vicigita}
\]

\(A_0\) respondas al la kalkulo uzante tutajn notojn, \(A_1\) al la propono kun unu decimala loko, kaj \(A_\mathrm{ref}\) al la negranda referenco ene de la modelo. La kalkulo povas esti efektivigita rekte en Rust , ekzemple.:

const SCHOOL_GYMNASIUM: i32 = 0;
const SCHOOL_REALSCHULE: i32 = 1;
const SCHOOL_MITTELSCHULE: i32 = 2;
const FLOAT_TOLERANCE: f64 = 1e-9;

#[derive(Clone, Copy, Default)]
struct Statistic {
    conflict_count: u64,
    total_count: u64,
}

fn determine_school(average: f64) -> i32 {
    if average <= 2.33 {
        return SCHOOL_GYMNASIUM;
    }
    if average <= 2.66 {
        return SCHOOL_REALSCHULE;
    }
    SCHOOL_MITTELSCHULE
}

fn calculate_average(note_deutsch: f64, note_mathe: f64, note_hsu: f64) -> f64 {
    let average = (note_deutsch + note_mathe + note_hsu) / 3.0;
    ((average + FLOAT_TOLERANCE) * 100.0).floor() / 100.0
}

fn round_to_whole_grade(grade: f64) -> f64 {
    grade.round()
}

fn round_to_one_decimal(grade: f64) -> f64 {
    (grade * 10.0).round() / 10.0
}

fn normalize_grade(grade: f64) -> f64 {
    (grade * 100.0).round() / 100.0
}

fn percentage(count: u64, total: u64) -> f64 {
    count as f64 / total as f64 * 100.0
}

fn main() {
    let mut combination_count = 0;
    let mut official_reference_conflicts = 0;
    let mut official_proposal_conflicts = 0;
    let mut proposal_reference_conflicts = 0;
    let mut statistics = [Statistic::default(); 4];

    let mut note_deutsch = 1.0;
    while note_deutsch <= 6.0 {
        let mut note_mathe = 1.0;
        while note_mathe <= 6.0 {
            let mut note_hsu = 1.0;
            while note_hsu <= 6.0 {
                combination_count += 1;

                let official_average = calculate_average(
                    round_to_whole_grade(note_deutsch),
                    round_to_whole_grade(note_mathe),
                    round_to_whole_grade(note_hsu),
                );
                let proposed_average = calculate_average(
                    round_to_one_decimal(note_deutsch),
                    round_to_one_decimal(note_mathe),
                    round_to_one_decimal(note_hsu),
                );
                let reference_average =
                    calculate_average(note_deutsch, note_mathe, note_hsu);
                let official_school = determine_school(official_average);
                let proposed_school = determine_school(proposed_average);
                let reference_school = determine_school(reference_average);

                if official_average == 3.0 {
                    statistics[0].total_count += 1;
                    if reference_school != SCHOOL_MITTELSCHULE {
                        statistics[0].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[1].total_count += 1;
                    if reference_school == SCHOOL_GYMNASIUM {
                        statistics[1].conflict_count += 1;
                    }
                }
                if official_average == 2.33 {
                    statistics[2].total_count += 1;
                    if reference_school != SCHOOL_GYMNASIUM {
                        statistics[2].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[3].total_count += 1;
                    if reference_school == SCHOOL_MITTELSCHULE {
                        statistics[3].conflict_count += 1;
                    }
                }

                if official_school != reference_school {
                    official_reference_conflicts += 1;
                }
                if official_school != proposed_school {
                    official_proposal_conflicts += 1;
                }
                if proposed_school != reference_school {
                    proposal_reference_conflicts += 1;
                }

                note_hsu = normalize_grade(note_hsu + 0.01);
            }
            note_mathe = normalize_grade(note_mathe + 0.01);
        }
        note_deutsch = normalize_grade(note_deutsch + 0.01);
    }

    println!(
        "official/reference: {}%",
        percentage(official_reference_conflicts, combination_count)
    );
    println!(
        "official/proposal: {}%",
        percentage(official_proposal_conflicts, combination_count)
    );
    println!(
        "proposal/reference: {}%",
        percentage(proposal_reference_conflicts, combination_count)
    );
    for (index, statistic) in statistics.iter().enumerate() {
        println!(
            "#{}: {}% ({}/{})",
            index + 1,
            percentage(statistic.conflict_count, statistic.total_count),
            statistic.conflict_count,
            statistic.total_count
        );
    }
}

La malgranda toleremo en calculate_average malhelpas valoron kiel ekzemple \(2{,}67\) pro ĝia duuma flosilo-reprezento, ĝi estis erare konsiderata \(2{,}669999\ldots\) estas fortranĉita. normalize_grade Plue, ĝi reduktas ĉiun buklovaloron reen al centono-orda krado. Ekzistas almenaŭ du malsamaj eblaj mezvaloroj. \(1/300\) aparte; la toleremo de \(10^{-9}\) estas tial sufiĉe malgranda por ne ŝanĝi iun ajn realan liman kazon.

La programo estas kompilita kaj komencita per

rustc -O calc.rs && ./calc

La programo iteracias tra ĉiuj \(125\,751\,501\) kombinaĵoj kaj redonas:

KomparoPorcio
Tutaj notoj kontraŭ rondigitaj fakaj mezumoj\(10{,}4411\,\%\)
Tutaj notoj kompare kun la propono kun unu decimala loko\(10{,}1521\,\%\)
Propono kun unu decimala loko kompare kun nerondigitaj fakuloj\(0{,}6615\,\%\)

La centra valoro por mi estas \(10{,}4411\,\%\): En pli ol unu el dek kombinaĵoj, frua rondigo al tutaj notoj kondukas al malsama kalkulita lernejtipo ol la negraonda referenco. Ĉi tiu proporcio priskribas ekskluzive la rondigan efikon ene de la elektita modelo.

Ŝanĝo al spertaj averaĝoj kun unu decimala loko kondukus al malsama klasifiko en \(10{,}1521\,\%\) de ĉiuj modelaj kazoj kompare kun la antaŭa metodo. Tamen, la tria komparo estas decida: kompare kun la negranda referenco, la metodo kun unu decimala loko lasas nur \(0{,}6615\,\%\) deviantaj kazoj. La devio de la referenco tiel malpliiĝas je

\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]

Ĉi tio, por mi, estas ĝuste la pridubinda konsekvenco de la nuna kalkulmetodo: la supozeblaj fakspecifaj atingoj restas senŝanĝaj; nur la momento, kiam okazas rondigo, povas ŝanĝi la kalkulitan lernejtipon. Kvankam kalkulado kun unu decimala pozicio ne tute forigas ĉi tiun efikon, ĝi signife reduktas ĝin ene de la modelo.

Tamen, ĉi tiuj ciferoj ne diras al ni kiom da infanoj estas efektive trafitaj. La notoj sur la lernolibroj ne nepre estas generitaj kiel meĥanike rondigitaj averaĝoj, la akademia agado estas nek unuforme distribuita nek sendependa, kaj la efektiva elekto de lernejtipo ne dependas nur de ĉi tiuj tri ciferoj. Mia kalkulo respondas pli specifan demandon: Kiom ofte rondigo ŝanĝas la kalkulitan noton kiam ĉiuj kombinaĵoj de centonovaloroj estas same verŝajnaj?

Fine, komparo kun la originala afiŝo: La totala tie menciita procento, proksimume \(10\,\%\) estas proksima al mia \(10{,}4411\,\%\) . Tamen, miaj kalkuloj ne konfirmas la kvar individuajn kazojn, ĉiu raportita kiel \(1/6 \approx 17\,\%\) Por "maltrafis mezlernejon kun \(3{,}00\) ", "maltrafis bazlernejon kun \(2{,}33\) ", "atingis bazlernejon kun \(2{,}66\) ", kaj "atingis mezlernejon kun \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .

La kvar valoroj estas kondiĉaj probablecoj kun malsamgrandaj referencaj grupoj. Sen malsame difinita provaĵspaco \(1/6\) ne povas esti derivita el ili. Mia kalkulo do konfirmas la rondigan efikon, sed ne ĉi tiujn individuajn probablecojn. Ĉiukaze, asertoj pri la efektiva nombro de koncernitaj infanoj postulus realajn notajn distribuojn kaj iliajn dependecojn.

Reen