Doug, Borrowing from the fp_equal() subroutine used to compare whether two floating-point numbers are equal, to a particular number of decimal places, found at: http://perldoc.perl.org/perlop.html#Floating-point-Arithmetic
you could test whether the values of $molt4 and $actualM rounded to the desired precision (e.g., 3 decimal places) are the same, and if so, set the $percenterror to 0, otherwise calculate $percenterror, using the method you used in your example. $precision = 3; if (&roundto($molt4,$precision) eq &roundto($actualM,$precision)) { $percenterror = 0; } else { $percenterror=abs($molt4-$actualM)*100/$actualM; } For any user supplied input you should also validate that the experimental data are reasonable. Note: you could also set an absolute tolerance for the case where the $percenterror is 0, and use a relative tolerance otherwise. (Note: any tolerance defined within the problem could be overridden within a course). if (&roundto($molt4,$precision) eq &roundto($actualM,$precision)) { $temp = 0; $percenterror = 0; $tol = 0.1; } else { $tol = '5%'; $temp = $molt4-$actualM; $percenterror=abs($molt4-$actualM)*100/$actualM; } <numericalresponse format="3s" answer="$percenterror" id="11"> <responseparam name="tol" type="tolerance" default="$tol" description="Numerical Tolerance" /> <responseparam name="sig" type="int_range" default="3,4" description="Significant Digits" /> <textline readonly="no" /> </numericalresponse> Stuart Raeburn LON-CAPA Academic Consortium ________________________________________ From: LON-CAPA-users <lon-capa-users-boun...@mail.lon-capa.org> on behalf of Mills, Douglas G <dmi...@illinois.edu> Sent: Tuesday, November 26, 2019 4:55 PM To: Discussion list for LON-CAPA users Cc: Mills, Douglas G Subject: [LON-CAPA-users] How Best to Resolve Floating Point Issues? Hi All, I've run into a situation where the binary representation of base 10 numbers is catching up to us for a very small percentage of our students. To illustrate this I've created a public problem demonstrating the issue. Unlike the problems the students get this one, for the sake of demonstration, walks you through the calculations but uses the exact same numbers that one of our students had to work with resulting in a case where what should be zero is not equal to zero. What's the best way of preventing this from happening? (The source code is open also in case you want to have a look but it's pretty well spelled out in the problem itself for demonstration purposes). https://access3.lon-capa.illinois.edu/res/uiuc/dmills/scratchwork/FloatingPointIssueDemo.problem<https://urldefense.com/v3/__https://access3.lon-capa.illinois.edu/res/uiuc/dmills/scratchwork/FloatingPointIssueDemo.problem__;!ioFpBMP7lJU!kYg_ctrV6fkf5-Q0k15HPZw7eDzJHG_oXmJmgLbFYGCVB4UljJ9noqPl_BVJGg$> Thanks in advance and, on that topic, Happy Thanksgiving! Doug DOUGLAS G MILLS Director of Instructional Technology Department of Chemistry University of Illinois at Urbana-Champaign Chemistry Annex Box A2 601 S. Mathews | M/C 712 Urbana, IL 61801 217.244.5739 | fax: 217.244.8029 | dmi...@illinois.edu<mailto:dmi...@illinois.edu> chemistry.illinois.edu<https://urldefense.com/v3/__http://chemistry.illinois.edu__;!ioFpBMP7lJU!kYg_ctrV6fkf5-Q0k15HPZw7eDzJHG_oXmJmgLbFYGCVB4UljJ9noqMWvh09LQ$> [/var/folders/kv/f3wpy1cs51521x5grm_qx4tw0000gn/T/com.microsoft.Outlook/WebArchiveCopyPasteTempFiles/P698ojxP4tc7j8gMqgPv+E4KQAAAABJRU5ErkJggg==]<https://urldefense.com/v3/__http://illinois.edu/__;!ioFpBMP7lJU!kYg_ctrV6fkf5-Q0k15HPZw7eDzJHG_oXmJmgLbFYGCVB4UljJ9noqPPexT8GA$> Under the Illinois Freedom of Information Act any written communication to or from university employees regarding university business is a public record and may be subject to public disclosure.
_______________________________________________ LON-CAPA-users mailing list LON-CAPA-users@mail.lon-capa.org http://mail.lon-capa.org/mailman/listinfo/lon-capa-users