@@ -268,7 +268,7 @@ my module sprintf {
268
268
!! has_flag($/ , ' space' ) ?? ' '
269
269
!! ' ' ;
270
270
$ float := nqp ::abs_n($ float );
271
- $ float := stringify-to-precision($ float , $ precision );
271
+ $ float := stringify-to-precision($ float , $ precision ) unless nqp ::isnanorinf( $ float ) ;
272
272
pad-with-sign($ sign , $ float , $ size , $ pad );
273
273
}
274
274
sub scientific ($ float , $ e , $ precision , $ size , $ pad , $/ ) {
@@ -277,14 +277,16 @@ my module sprintf {
277
277
!! has_flag($/ , ' space' ) ?? ' '
278
278
!! ' ' ;
279
279
$ 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
+ }
288
290
}
289
291
pad-with-sign($ sign , $ float , $ size , $ pad );
290
292
}
@@ -295,6 +297,8 @@ my module sprintf {
295
297
!! ' ' ;
296
298
$ float := nqp ::abs_n($ float );
297
299
300
+ return pad-with-sign($ sign , $ float , $ size , $ pad ) if nqp ::isnanorinf($ float );
301
+
298
302
my $ exp := $ float == 0.0 ?? 0 !! nqp ::floor_n(nqp ::log_n($ float ) / nqp ::log_n(10 ));
299
303
300
304
if -2 - $ precision < $ exp && $ exp < $ precision {
0 commit comments