|
563 | 563 | x::Int
|
564 | 564 | end
|
565 | 565 | MyInt(x::MyInt) = x
|
566 |
| - Base.:+(a::MyInt, b::MyInt) = a.x + b.x |
| 566 | + Base.uabs(x::MyInt) = Base.uabs(x.x) |
567 | 567 |
|
568 | 568 | for n in 0:100
|
569 | 569 | x = ceil(Int, log2(n + 1))
|
|
579 | 579 | @test 32 == Base.top_set_bit(Int32(n)) == Base.top_set_bit(unsigned(Int32(n)))
|
580 | 580 | @test 8 == Base.top_set_bit(Int8(n)) == Base.top_set_bit(unsigned(Int8(n)))
|
581 | 581 | @test_throws DomainError Base.top_set_bit(big(n))
|
582 |
| - # This error message should never be exposed to the end user anyway. |
583 |
| - err = n == -1 ? InexactError : DomainError |
584 |
| - @test_throws err Base.top_set_bit(MyInt(n)) |
585 | 582 | end
|
586 | 583 |
|
587 | 584 | @test count_zeros(Int64(1)) == 63
|
|
601 | 598 | @test isqrt(Int8(5)) === Int8(2)
|
602 | 599 | end
|
603 | 600 |
|
| 601 | +@testset "exponent and top_set_bit consistency" begin |
| 602 | + for _T in (Int8, Int16, Int32, Int64, Int128) |
| 603 | + for issigned in (false, true) |
| 604 | + T = issigned ? _T : unsigned(_T) |
| 605 | + nbits = 8sizeof(T) |
| 606 | + @test_throws DomainError exponent(T(0)) |
| 607 | + @test Base.top_set_bit(T(0)) == 0 |
| 608 | + @test Base.top_set_bit(T(0)) == invoke(Base.top_set_bit, Tuple{Integer}, T(0)) |
| 609 | + |
| 610 | + for i in 0:(nbits - (issigned ? 2 : 1)) |
| 611 | + p2 = T(1) << i |
| 612 | + @test exponent(p2) == i |
| 613 | + @test exponent(p2) == invoke(exponent, Tuple{Integer}, p2) |
| 614 | + @test Base.top_set_bit(p2) == i + 1 |
| 615 | + @test Base.top_set_bit(p2) == invoke(Base.top_set_bit, Tuple{Integer}, p2) |
| 616 | + |
| 617 | + p2m1 = p2 - T(1) |
| 618 | + if p2m1 != 0 |
| 619 | + @test exponent(p2m1) == i - 1 |
| 620 | + @test exponent(p2m1) == invoke(exponent, Tuple{Integer}, p2m1) |
| 621 | + @test Base.top_set_bit(p2m1) == i |
| 622 | + @test Base.top_set_bit(p2m1) == invoke(Base.top_set_bit, Tuple{Integer}, p2m1) |
| 623 | + end |
| 624 | + |
| 625 | + p2p1 = p2 + T(1) |
| 626 | + if p2p1 != 0 |
| 627 | + @test exponent(p2p1) == max(i, 1) |
| 628 | + @test exponent(p2p1) == invoke(exponent, Tuple{Integer}, p2p1) |
| 629 | + @test Base.top_set_bit(p2p1) == max(i, 1) + 1 |
| 630 | + @test Base.top_set_bit(p2p1) == invoke(Base.top_set_bit, Tuple{Integer}, p2p1) |
| 631 | + end |
| 632 | + end |
| 633 | + |
| 634 | + @test exponent(typemax(T)) == nbits - (issigned ? 2 : 1) |
| 635 | + @test exponent(typemax(T)) == invoke(exponent, Tuple{Integer}, typemax(T)) |
| 636 | + expected_max = !issigned ? nbits : nbits - 1 |
| 637 | + @test Base.top_set_bit(typemax(T)) == expected_max |
| 638 | + @test Base.top_set_bit(typemax(T)) == invoke(Base.top_set_bit, Tuple{Integer}, typemax(T)) |
| 639 | + |
| 640 | + if issigned |
| 641 | + for val in [T(-1), T(-2), T(-17), typemin(T)] |
| 642 | + expected = exponent(abs(BigInt(val))) |
| 643 | + @test exponent(val) == expected |
| 644 | + @test exponent(val) == invoke(exponent, Tuple{Integer}, val) |
| 645 | + @test Base.top_set_bit(val) == nbits |
| 646 | + @test invoke(Base.top_set_bit, Tuple{Integer}, val) == expected + 1 |
| 647 | + end |
| 648 | + end |
| 649 | + end |
| 650 | + |
| 651 | + @test exponent(big(2)^100) == 100 |
| 652 | + @test exponent(big(2)^100 - 1) == 99 |
| 653 | + @test exponent(big(2)^100 + 1) == 100 |
| 654 | + @test exponent(big(-1)) == 0 |
| 655 | + @test_throws DomainError exponent(big(0)) |
| 656 | + |
| 657 | + @test Base.top_set_bit(big(0)) == 0 |
| 658 | + @test Base.top_set_bit(big(2)^100) == 101 |
| 659 | + @test Base.top_set_bit(big(2)^100 - 1) == 100 |
| 660 | + @test Base.top_set_bit(big(2)^100 + 1) == 101 |
| 661 | + @test_throws DomainError Base.top_set_bit(big(-1)) |
| 662 | + end |
| 663 | +end |
| 664 | + |
604 | 665 | @testset "issue #4884" begin
|
605 | 666 | @test isqrt(9223372030926249000) == 3037000498
|
606 | 667 | @test isqrt(typemax(Int128)) == parse(Int128,"13043817825332782212")
|
|
0 commit comments