Skip to content

Commit 94d5575

Browse files
committed
Handle NaN and Inf in sprintf (directives e, f, g)
1 parent 03b69e4 commit 94d5575

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

src/HLL/sprintf.nqp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ my module sprintf {
268268
!! has_flag($/, 'space') ?? ' '
269269
!! '';
270270
$float := nqp::abs_n($float);
271-
$float := stringify-to-precision($float, $precision);
271+
$float := stringify-to-precision($float, $precision) unless nqp::isnanorinf($float);
272272
pad-with-sign($sign, $float, $size, $pad);
273273
}
274274
sub scientific($float, $e, $precision, $size, $pad, $/) {
@@ -277,14 +277,16 @@ my module sprintf {
277277
!! has_flag($/, 'space') ?? ' '
278278
!! '';
279279
$float := nqp::abs_n($float);
280-
my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10));
281-
$float := $float / nqp::pow_n(10, $exp);
282-
$float := stringify-to-precision($float, $precision);
283-
if $exp < 0 {
284-
$exp := -$exp;
285-
$float := $float ~ $e ~ '-' ~ ($exp < 10 ?? '0' !! '') ~ $exp;
286-
} else {
287-
$float := $float ~ $e ~ '+' ~ ($exp < 10 ?? '0' !! '') ~ $exp;
280+
unless nqp::isnanorinf($float) {
281+
my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10));
282+
$float := $float / nqp::pow_n(10, $exp);
283+
$float := stringify-to-precision($float, $precision);
284+
if $exp < 0 {
285+
$exp := -$exp;
286+
$float := $float ~ $e ~ '-' ~ ($exp < 10 ?? '0' !! '') ~ $exp;
287+
} else {
288+
$float := $float ~ $e ~ '+' ~ ($exp < 10 ?? '0' !! '') ~ $exp;
289+
}
288290
}
289291
pad-with-sign($sign, $float, $size, $pad);
290292
}
@@ -295,6 +297,8 @@ my module sprintf {
295297
!! '';
296298
$float := nqp::abs_n($float);
297299

300+
return pad-with-sign($sign, $float, $size, $pad) if nqp::isnanorinf($float);
301+
298302
my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10));
299303

300304
if -2 - $precision < $exp && $exp < $precision {

0 commit comments

Comments
 (0)