Ralat pembundaran semasa peralihan

Di Bavaria, purata gred keseluruhan \(2{,}33\) mengesahkan kesesuaian untuk Gimnasium \(2{,}34\) tidak. Pada had yang tajam ini, susunan dua operasi pembundaran boleh menentukan sisi mana kanak-kanak jatuh. Günther Felbinger membincangkan potensi akibat kesan pembundaran ini dalam catatan blog . Atas minat yang mendalam, saya mengira kesannya sendiri merentasi semua kombinasi gred yang dibenarkan dalam model.


Soalan utama saya ialah: Berapa kerapkah pembundaran awal kepada gred keseluruhan subjek membawa kepada jenis pengiraan sekolah yang berbeza daripada pengiraan menggunakan purata subjek yang tidak dibundarkan? Tambahan pula, adalah menarik untuk melihat perubahan jika purata subjek individu (seperti yang dicadangkan di sana) pada mulanya dibundarkan kepada hanya satu tempat perpuluhan.

Menurut Seksyen 6 Peraturan Sekolah Rendah Bavaria, purata gred dikira daripada gred dalam Bahasa Jerman, Matematik dan Pengajian Tempatan dan Umum. Peraturan pelaksanaan menetapkan had sehingga dan termasuk \(2{,}33\) dan sehingga dan termasuk \(2{,}66\) . Dalam model pengiraan berikut, setiap purata keseluruhan dipotong kepada dua tempat perpuluhan dan tidak dibundarkan semula. Oleh itu, sebagai contoh...

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

Ini penting untuk pengelasan: \(2{,}3366\ldots\) tidak menjadi \(2{,}34\) , tetapi \(2{,}33\) dan oleh itu masih mencukupi untuk sekolah tatabahasa.

Entri awal menggambarkan pembundaran awal dengan nilai min khusus subjek yang diandaikan \(1{,}6\) , \(2{,}6\) , dan \(2{,}6\) . Daripada jumlah ini, keseluruhan gred \(2\) , \(3\) , dan \(3\) diterbitkan dahulu. Min mereka ialah

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

yang bermaksud pelajar tersebut tidak layak ke sekolah tatabahasa. Walau bagaimanapun, tanpa pembundaran kepada gred penuh, hasil dalam contoh hipotetikal adalah...

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

Dalam contoh kedua, pembundaran berfungsi dalam arah yang bertentangan: \(2{,}4\) , \(3{,}4\) dan \(2{,}4\) menjadi nilai nota keseluruhan \(2\) , \(3\) dan \(2\) , secara rasminya \(2{,}33\) . Walau bagaimanapun, nilai tidak dibundarkan menghasilkan \(2{,}73\) . Contoh-contoh tersebut menunjukkan kesannya dengan jelas. Walau bagaimanapun, ia masih belum mendedahkan kekerapan ia berlaku atau akibat daripada kaedah pembundaran yang berbeza.

Oleh itu, untuk pengiraan saya, saya menggunakan ruang hasil yang jelas. Setiap min subjek boleh menjadi salah satu daripada nilai \(501\) di dalamnya.

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

Andaikan. Saya memberatkan semua kombinasi tertib bahasa Jerman, matematik, dan pengajian tempatan dan umum secara sama rata. Oleh itu, terdapat

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

Kes. Oleh itu, model ini tidak samar-samar, tetapi tiruan: Ia mengandaikan purata subjek yang diagihkan sama rata, kebebasan ketiga-tiga subjek, dan langkah tepat seperseratus. Ia tidak mencerminkan taburan sebenar kanak-kanak sekolah rendah Bavaria.

Untuk tiga subjek bermakna \(d,m,h\) kita tulis

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

untuk purata keseluruhan dipendekkan kepada dua tempat perpuluhan. Sekarang kita bandingkan tiga kaedah pengiraan.:

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

\(A_0\) sepadan dengan pengiraan menggunakan gred keseluruhan, \(A_1\) sepadan dengan cadangan dengan satu tempat perpuluhan dan \(A_\mathrm{ref}\) sepadan dengan rujukan tak bulat dalam model. Pengiraan boleh dilaksanakan secara langsung dalam Rust , contohnya.:

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
        );
    }
}

Toleransi kecil dalam calculate_average menghalang nilai seperti \(2{,}67\) kerana perwakilan apungan binarinya, ia telah dianggap secara salah \(2{,}669999\ldots\) dipotong. normalize_grade Tambahan pula, ia mengurangkan setiap nilai gelung kembali kepada grid tertib keseratus. Sekurang-kurangnya dua nilai min yang berbeza mungkin wujud. \(1/300\) selain; toleransi terhadap \(10^{-9}\) oleh itu, cukup kecil untuk tidak mengubah sebarang kes sempadan sebenar.

Program ini dikompilasi dan dimulakan dengan

rustc -O calc.rs && ./calc

Program ini mengulang semua kombinasi \(125\,751\,501\) dan mengembalikan:

PerbandinganBahagian
Gred keseluruhan berbanding purata subjek yang tidak dibundarkan\(10{,}4411\,\%\)
Gred keseluruhan berbanding cadangan dengan satu tempat perpuluhan\(10{,}1521\,\%\)
Cadangan dengan satu tempat perpuluhan berbanding purata pakar yang tidak dibundarkan\(0{,}6615\,\%\)

Nilai utama bagi saya ialah \(10{,}4411\,\%\): Dalam lebih daripada satu dalam sepuluh kombinasi, pembundaran awal kepada gred keseluruhan membawa kepada jenis sekolah terkira yang berbeza daripada rujukan tidak dibundarkan. Perkadaran ini menerangkan secara eksklusif kesan pembundaran dalam model yang dipilih.

Beralih kepada purata pakar dengan satu tempat perpuluhan akan membawa kepada pengelasan yang berbeza dalam \(10{,}1521\,\%\) daripada semua kes model berbanding kaedah sebelumnya. Walau bagaimanapun, perbandingan ketiga adalah penting: berbanding rujukan tak bulat, kaedah dengan satu tempat perpuluhan hanya meninggalkan \(0{,}6615\,\%\) kes yang menyimpang. Oleh itu, sisihan daripada rujukan berkurangan sebanyak

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

Bagi saya, inilah akibat yang meragukan daripada kaedah pengiraan semasa: pencapaian khusus subjek yang diandaikan kekal tidak berubah; hanya titik masa di mana pembundaran berlaku boleh mengubah jenis sekolah yang dikira. Walaupun pengiraan dengan satu tempat perpuluhan tidak menghapuskan sepenuhnya kesan ini, ia mengurangkannya dengan ketara dalam model.

Walau bagaimanapun, angka-angka ini tidak memberitahu kita berapa ramai kanak-kanak yang sebenarnya terjejas. Gred kad laporan tidak semestinya dijana sebagai purata yang dibundarkan secara mekanikal, prestasi akademik tidak diagihkan secara seragam mahupun tidak bersandar, dan pilihan sebenar jenis sekolah tidak bergantung semata-mata pada ketiga-tiga angka ini. Pengiraan saya menjawab soalan yang lebih spesifik: Berapa kerapkah pembundaran mengubah gred yang dikira apabila semua kombinasi nilai perseratus adalah sama kemungkinannya?

Akhir sekali, perbandingan dengan catatan asal: Kadar keseluruhan yang dinyatakan di sana, kira-kira \(10\,\%\) hampir dengan \(10{,}4411\,\%\) saya. Walau bagaimanapun, pengiraan saya tidak mengesahkan empat kes individu, setiap satunya dilaporkan sebagai \(1/6 \approx 17\,\%\) Bagi "ponteng sekolah menengah dengan \(3{,}00\) ", "ponteng sekolah tatabahasa dengan \(2{,}33\) ", "capai sekolah tatabahasa dengan \(2{,}66\) ", dan "capai sekolah menengah dengan \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .

Empat nilai tersebut merupakan kebarangkalian bersyarat dengan kumpulan rujukan bersaiz berbeza. Tanpa ruang sampel yang ditakrifkan secara berbeza \(1/6\) tidak dapat diperoleh daripadanya. Oleh itu, pengiraan saya mengesahkan kesan pembundaran, tetapi bukan kebarangkalian individu ini. Walau apa pun, pernyataan tentang bilangan sebenar kanak-kanak yang terjejas memerlukan taburan gred sebenar dan kebergantungannya.

Belakang