--- loncom/homework/caparesponse/caparesponse.pm 2018/09/13 17:00:05 1.259 +++ loncom/homework/caparesponse/caparesponse.pm 2021/10/05 02:41:32 1.263 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.259 2018/09/13 17:00:05 raeburn Exp $ +# $Id: caparesponse.pm,v 1.263 2021/10/05 02:41:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -401,7 +401,7 @@ sub setup_capa_response { if (ref($response)) { $$args_ref{'response'}=dclone($response); } else { - $$args_ref{'response'}=dclone([$response]); + $$args_ref{'response'}=dclone(["$response"]); } } @@ -760,7 +760,11 @@ sub end_numericalresponse { my $ans=$answers[$i]; my $fmt=$formats[0]; if (@formats && $#formats) {$fmt=$formats[$i];} - foreach my $element (@$ans) { + my @answers; + if (ref($ans) eq 'ARRAY') { + @answers = (@{$ans}); + } + foreach my $element (@answers) { if ($fmt && $tag eq 'numericalresponse') { $fmt=~s/e/E/g; if ($unit=~/\$/) { $fmt="\$".$fmt; $unit=~s/\$//g; } @@ -770,7 +774,7 @@ sub end_numericalresponse { if ($fmt=~/\$/ && !$needsdollar) { $element=~s/\$//; } } } - push(@fmt_ans,join(',',@$ans)); + push(@fmt_ans,join(',',@answers)); } my $response=\@fmt_ans; @@ -1061,7 +1065,23 @@ sub make_numerical_bubbles { &Math::Random::random_uniform_integer(1,1,10); } for ($ind=0;$ind<$number_of_bubbles;$ind++) { - $bubble_values[$ind] = $answerfactor*($factor**($power-$powers[$#powers-$ind])); + my $exponent = $power-$powers[$#powers-$ind]; + $bubble_values[$ind] = $answerfactor*($factor**$exponent); + + # If bubble is for correct answer (i.e., exponent = 0), and value + # of $answerfactor * factor**$exponent is an integer with more than + # 15 digits, assign $answerfactor itself as bubble value. + # This prevents a "use fewer digits" issue on 64bit servers + # when correct answer is >= 1e+16, and when correct bubble is A. + + if ($exponent == 0) { + if ($bubble_values[$ind] =~ /^-?(\d+)$/) { + if (length($1) > 15) { + $bubble_values[$ind] = $answerfactor; + } + } + } + $bubble_display[$ind] = &format_number($bubble_values[$ind], $format,$target,$safeeval); }