@@ -388,6 +388,8 @@ test_that("Edge cases for character/factor comparisons work", {
388388})
389389
390390test_that(" power with integer64" , {
391+ overflow_warning = " NAs produced by integer64 overflow"
392+
391393 # within integer range
392394 x = as.integer(sqrt(.Machine $ integer.max ))
393395 x = seq(- x , x )
@@ -397,7 +399,64 @@ test_that("power with integer64", {
397399 # within integer64 range, which fails with double exponent
398400 expect_identical(as.integer64(" 2147483650" )^ 2L , as.integer64(" 4611686027017322500" ))
399401 expect_identical(as.integer64(" -2147483650" )^ 2L , as.integer64(" 4611686027017322500" ))
400- expect_identical(as.integer64(" 94906267" )^ 2L , as.integer64(" 94906267" )* as.integer64(" 94906267" ))
401-
402- expect_warning(expect_identical(as.integer64(" 2147483650" )^ 3L , NA_integer64_ ), " NAs produced by integer64 overflow" )
402+ expect_identical(as.integer64(" 94906267" )^ 2L , as.integer64(" 94906267" ) * as.integer64(" 94906267" ))
403+
404+ # integer64 base with integer64 exponent
405+ expect_identical(as.integer64(10 ) ^ as.integer64(3 ), as.integer64(1000 ))
406+ expect_identical(as.integer64(" 2147483650" ) ^ as.integer64(2 ), as.integer64(" 4611686027017322500" ))
407+ expect_identical(as.integer64(2 ) ^ 62L , as.integer64(" 4611686018427387904" ))
408+ expect_identical(as.integer64(2 ) ^ as.integer64(62 ), as.integer64(" 4611686018427387904" ))
409+ expect_identical(as.integer64(3 ) ^ 39L , as.integer64(" 4052555153018976267" ))
410+
411+ # Special bases: 0, 1, -1
412+ expect_identical(as.integer64(0 ) ^ 0L , as.integer64(1L ))
413+ expect_identical(as.integer64(0 ) ^ 1L , as.integer64(0L ))
414+ expect_identical(as.integer64(0 ) ^ 5L , as.integer64(0L ))
415+ expect_warning(expect_identical(as.integer64(0 ) ^ (- 1L ), NA_integer64_ ))
416+
417+ expect_identical(as.integer64(1 ) ^ 0L , as.integer64(1L ))
418+ expect_identical(as.integer64(1 ) ^ 100L , as.integer64(1L ))
419+ expect_identical(as.integer64(1 ) ^ (- 5L ), as.integer64(1L ))
420+ expect_identical(as.integer64(1 ) ^ lim.integer64()[2L ], as.integer64(1L ))
421+
422+ expect_identical(as.integer64(- 1 ) ^ 0L , as.integer64(1L ))
423+ expect_identical(as.integer64(- 1 ) ^ 1L , as.integer64(- 1L ))
424+ expect_identical(as.integer64(- 1 ) ^ 2L , as.integer64(1L ))
425+ expect_identical(as.integer64(- 1 ) ^ 3L , as.integer64(- 1L ))
426+ expect_identical(as.integer64(- 1 ) ^ (- 1L ), as.integer64(- 1L ))
427+ expect_identical(as.integer64(- 1 ) ^ (- 2L ), as.integer64(1L ))
428+ expect_identical(as.integer64(- 1 ) ^ (- 3L ), as.integer64(- 1L ))
429+ expect_identical(as.integer64(- 1 ) ^ lim.integer64()[2L ], as.integer64(- 1L ))
430+
431+ # Negative exponents with |base| >= 2
432+ expect_identical(as.integer64(2 ) ^ (- 1L ), as.integer64(0L ))
433+ expect_identical(as.integer64(2 ) ^ (- 5L ), as.integer64(0L ))
434+ expect_identical(as.integer64(- 2 ) ^ (- 1L ), as.integer64(0L ))
435+
436+ # Overflow detection with both odd and even exponents
437+ expect_warning(expect_identical(as.integer64(" 2147483650" ) ^ 3L , NA_integer64_ ), overflow_warning )
438+ expect_warning(expect_identical(as.integer64(100000 ) ^ 8L , NA_integer64_ ), overflow_warning )
439+ expect_warning(expect_identical(as.integer64(2 ) ^ 63L , NA_integer64_ ), overflow_warning )
440+ expect_warning(expect_identical(as.integer64(2 ) ^ 64L , NA_integer64_ ), overflow_warning )
441+ expect_warning(expect_identical(as.integer64(3 ) ^ 40L , NA_integer64_ ), overflow_warning )
442+ expect_warning(expect_identical(as.integer64(3 ) ^ 64L , NA_integer64_ ), overflow_warning )
443+ expect_warning(expect_identical(lim.integer64()[1L ] ^ 2L , NA_integer64_ ), overflow_warning )
444+ expect_warning(expect_identical(lim.integer64()[2L ] ^ 2L , NA_integer64_ ), overflow_warning )
445+
446+ # Missing values and empty inputs
447+ expect_no_warning(expect_identical(NA_integer64_ ^ 2L , NA_integer64_ ))
448+ expect_no_warning(expect_identical(as.integer64(2 ) ^ NA_integer_ , NA_integer64_ ))
449+ expect_no_warning(expect_identical(as.integer64(2 ) ^ NA_integer64_ , NA_integer64_ ))
450+ expect_no_warning(expect_identical(as.integer64(2 ) ^ NA_real_ , NA_integer64_ ))
451+ expect_identical(integer64(0 ) ^ 2L , integer64(0 ))
452+ expect_identical(as.integer64(2 ) ^ integer(0 ), integer64(0 ))
453+ expect_identical(integer64(0 ) ^ integer(0 ), integer64(0 ))
454+
455+ # Vectorization and recycling
456+ expect_identical(c(as.integer64(2 ), as.integer64(3 )) ^ 2L , as.integer64(c(4 , 9 )))
457+ expect_identical(as.integer64(2 ) ^ c(1L , 2L , 3L ), as.integer64(c(2 , 4 , 8 )))
458+ expect_warning(
459+ expect_identical(c(as.integer64(2 ), as.integer64(2 )) ^ c(2L , 64L ), c(as.integer64(4 ), NA_integer64_ )),
460+ overflow_warning
461+ )
403462})
0 commit comments