From 87cd4f546902aed3a77fd79d9547c184c0dc612a Mon Sep 17 00:00:00 2001 From: pichetp Date: Tue, 11 Dec 2007 08:56:24 +0000 Subject: [PATCH] MDL-12503 Loguniform and MDL-12421 rounding --- question/type/calculated/questiontype.php | 66 +++---------------- .../datasetdependent/datasetitems_form.php | 11 ++-- 2 files changed, 13 insertions(+), 64 deletions(-) diff --git a/question/type/calculated/questiontype.php b/question/type/calculated/questiontype.php index 5d70b63794..31e3a8738b 100644 --- a/question/type/calculated/questiontype.php +++ b/question/type/calculated/questiontype.php @@ -477,11 +477,11 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype function custom_generator_tools_part(&$mform, $idx, $j){ $minmaxgrp = array(); - $minmaxgrp[] =& $mform->createElement('text', "calcmin[$idx]", get_string('calcmin', 'qtype_datasetdependent'), 'size="3"'); - $minmaxgrp[] =& $mform->createElement('text', "calcmax[$idx]", get_string('calcmax', 'qtype_datasetdependent'), 'size="3"'); + $minmaxgrp[] =& $mform->createElement('text', "calcmin[$idx]", get_string('calcmin', 'qtype_datasetdependent')); + $minmaxgrp[] =& $mform->createElement('text', "calcmax[$idx]", get_string('calcmax', 'qtype_datasetdependent')); $mform->addGroup($minmaxgrp, 'minmaxgrp', get_string('minmax', 'qtype_datasetdependent'), ' - ', false); - $mform->setType('calcmin', PARAM_NUMBER); - $mform->setType('calcmax', PARAM_NUMBER); + $mform->setType("calcmin[$idx]", PARAM_NUMBER); + $mform->setType("calcmax[$idx]", PARAM_NUMBER); $precisionoptions = range(0, 10); $mform->addElement('select', "calclength[$idx]", get_string('calclength', 'qtype_datasetdependent'), $precisionoptions); @@ -709,63 +709,13 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype } if ($regs[1] == 'uniform') { $nbr = $regs[2] + ($regs[3]-$regs[2])*mt_rand()/mt_getrandmax(); - return round($nbr, $regs[4]); + return sprintf("%.".$regs[4]."f",$nbr); } else if ($regs[1] == 'loguniform') { $log0 = log(abs($regs[2])); // It would have worked the other way to - $nbr = exp($log0 + (log(abs($regs[3])) - $log0)*mt_rand()/mt_getrandmax()); - - // Reformat according to the precision $regs[4]: - - // Determine the format 0.[1-9][0-9]* for the nbr... - $p10 = 0; - while ($nbr < 1) { - --$p10; - $nbr *= 10; - } - while ($nbr >= 1) { - ++$p10; - $nbr /= 10; - } - // ... and have the nbr rounded off to the correct length - $nbr = round($nbr, $regs[4]); - - // Have the nbr written on a suitable format, - // Either scientific or plain numeric - if (-2 > $p10 || 4 < $p10) { - // Use scientific format: - $eX = 'e'.--$p10; - $nbr *= 10; - if (1 == $regs[4]) { - $nbr = $nbr.$eX; - } else { - // Attach additional zeros at the end of $nbr, - $nbr .= (1==strlen($nbr) ? '.' : '') - . '00000000000000000000000000000000000000000x'; - $nbr = substr($nbr, 0, $regs[4] +1).$eX; - } - } else { - // Stick to plain numeric format - $nbr *= "1e$p10"; - if (0.1 <= $nbr / "1e$regs[4]") { - $nbr = $nbr; - } else { - // Could be an idea to add some zeros here - $nbr .= (ereg('^[0-9]*$', $nbr) ? '.' : '') - . '00000000000000000000000000000000000000000x'; - $oklen = $regs[4] + ($p10 < 1 ? 2-$p10 : 1); - $nbr = substr($nbr, 0, $oklen); - } - } - - // The larger of the values decide the sign in case the - // have equal different signs (which they really must not have) - if ($regs[2] + $regs[3] > 0) { - return $nbr; - } else { - return -$nbr; - } - + $nbr = exp($log0 + (log(abs($regs[3])) - $log0)*mt_rand()/mt_getrandmax()); + return sprintf("%.".$regs[4]."f",$nbr); + } else { error("The distribution $regs[1] caused problems"); } diff --git a/question/type/datasetdependent/datasetitems_form.php b/question/type/datasetdependent/datasetitems_form.php index a9f1943585..593b6353ed 100644 --- a/question/type/datasetdependent/datasetitems_form.php +++ b/question/type/datasetdependent/datasetitems_form.php @@ -74,6 +74,7 @@ class question_dataset_dependent_items_form extends moodleform { $j = (($this->noofitems) * count($this->datasetdefs))+1; foreach ($this->datasetdefs as $defkey => $datasetdef){ $mform->addElement('text', "number[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name)); + $mform->setType("number[$j]", PARAM_NUMBER); $this->qtypeobj->custom_generator_tools_part(&$mform, $idx, $j); $idx++; $mform->addElement('hidden', "definition[$j]"); @@ -90,7 +91,7 @@ class question_dataset_dependent_items_form extends moodleform { for ($i=10; $i<=100 ; $i+=10){ $addremoveoptions["$i"]="$i"; } - $mform->addElement('header', 'additemhdr', get_string('add', 'moodle')); + $mform->addElement('header', 'additemhdr', get_string('add', 'moodle')); $mform->closeHeaderBefore('additemhdr'); if ($this->qtypeobj->supports_dataset_item_generation()){ @@ -128,10 +129,12 @@ class question_dataset_dependent_items_form extends moodleform { $mform->addElement('header', '', get_string('itemno', 'qtype_datasetdependent', $i)); foreach ($this->datasetdefs as $defkey => $datasetdef){ $mform->addElement('text', "number[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name)); - + $mform->setType("number[$j]", PARAM_NUMBER); $mform->addElement('hidden', "itemid[$j]"); + $mform->setType("itemid[$j]", PARAM_INT); $mform->addElement('hidden', "definition[$j]"); + $mform->setType("definition[$j]", PARAM_NOTAGS); $j--; } @@ -139,10 +142,6 @@ class question_dataset_dependent_items_form extends moodleform { $repeated[] =& $mform->addElement('static', "answercomment[$i]", $strquestionlabel); } } - $mform->setType('number', PARAM_NUMBER); - $mform->setType('itemid', PARAM_INT); - $mform->setType('definition', PARAM_NOTAGS); - //------------------------------------------------------------------------------------------------------------------------------ //non standard name for button element needed so not using add_action_buttons -- 2.39.5