WeBWorK Problems

Problems with absolute tolerance

Problems with absolute tolerance

by Adam Weyhaupt -
Number of replies: 3
The following problem should, according to (), set the absolute tolerance to require accuracy to 5 decimal places, but it doesn't seem to. (50.045 is the correct answer, but 52 is marked correct).


########################################################################

DOCUMENT();

loadMacros(
"PGstandard.pl", # Standard macros for PG language
"MathObjects.pl",
#"source.pl", # allows code to be displayed on certain sites.
#"PGcourse.pl", # Customization file for the course
);

# Print problem number and point value (weight) for the problem
TEXT(beginproblem());

# Show which answers are correct and which ones are incorrect
$showPartialCorrectAnswers = 1;

Context("Numeric");
$a = Compute("42.055");
$b = Compute("7.999");
$ans = $a + $b;
Context("LimitedNumeric");

BEGIN_TEXT
$a + $b = \{ans_rule(35)\}
END_TEXT

ANS(Compute("$ans")->with(tolType=>'absolute', tolerance=>1*E-5)->cmp);

ENDDOCUMENT();


I can fix this by changing the answer checker line to

ANS(Compute("$ans")->with(tolType=>'absolute', tolerance=>.000001)->cmp);

What am I missing? Thanks for your help!

Adam
In reply to Adam Weyhaupt

Re: Problems with absolute tolerance

by Davide Cervone -
I suspect the problem is the * in 1*E-5, which is not correct. You want just 1E-5. Tests seem to indicate that E-5 is being interpreted as 2.71828... (as though E were e and the -5 has no effect; it looks like E is defined as a subroutine (in PGbasicmacros.pl), which is passed -5 as an argument, which is being ignored as the procedure returns exp(1)). Then multiplying by 1 in 1*E-5 is just 2.71828... again. So you have set the tolerance to 2.71828... rather than .00001.

In any case, you want 1E-5 instead.

Davide
In reply to Davide Cervone

Re: Problems with absolute tolerance

by Adam Weyhaupt -
Davide -

Thanks for your help; this was the clue that I needed to figure it out. For the record, the syntax that works is:

ANS(Compute("$ans")->with(tolType=>'absolute', tolerance=>'1e-5')->cmp);

in particular,

ANS(Compute("$ans")->with(tolType=>'absolute', tolerance=>'1 E-5')->cmp);

does not seem to work.

I found the command

TEXT( pretty_print(Context()->{flags}));

very helpful in sorting this out.

I'll update the Wiki to correct the line that started all of this.

Thanks again,

Adam
In reply to Adam Weyhaupt

Re: Problems with absolute tolerance

by Davide Cervone -
You do not need the quotes, as
    ANS(Compute($ans)->with(tolType=>'absolute', tolerance=>1E-5)->cmp);
should do the trick. Also, you don't need the quotes around $ans as they are essentially redundant (there is only a difference if $ans is undefined).

You might also find the macros in PGinfo.pl to be helpful. See the documentation for this file for details.

Davide