Ancient

 view release on metacpan or  search on metacpan

t/7026-nvec-quadmath-safety.t  view on Meta::CPAN

    my $sum = $v->sum();
    ok($sum > 0, 'sum of tiny values is positive');
    ok(approx_eq($sum, $tiny * 13, $tol), 'sum of tiny values correct');
};

subtest 'edge cases: very large values' => sub {
    my $large = 1e300;
    my $v = nvec::new([$large, $large, $large]);

    my $sum = $v->sum();
    ok($sum > $large, 'sum of large values is larger');
    # For very large values, use relative tolerance
    my $mean = $v->mean();
    my $rel_error = abs($mean - $large) / $large;
    ok($rel_error < 1e-10, "mean of large values correct (rel error: $rel_error)");
};

subtest 'edge cases: mixed scales' => sub {
    my $v = nvec::new([1e-100, 1.0, 1e100]);

    # Use approximate comparison for very small/large values
    my $min = $v->min();
    my $max = $v->max();
    ok($min > 0 && $min < 1e-99, 'min finds smallest (order of 1e-100)');
    ok($max > 1e99, 'max finds largest (order of 1e100)');

    # Mean is dominated by the large value
    my $mean = $v->mean();
    ok($mean > 1e99, 'mean dominated by large value');
};

subtest 'edge cases: zeros' => sub {
    my $zeros = nvec::zeros(10);

    is($zeros->sum(), 0, 'sum of zeros');
    is($zeros->mean(), 0, 'mean of zeros');
    is($zeros->min(), 0, 'min of zeros');
    is($zeros->max(), 0, 'max of zeros');
    is($zeros->variance(), 0, 'variance of zeros');
    is($zeros->std(), 0, 'std of zeros');
};

subtest 'edge cases: single element' => sub {
    my $single = nvec::new([42.5]);

    is($single->len(), 1, 'length is 1');
    is($single->sum(), 42.5, 'sum of single');
    is($single->mean(), 42.5, 'mean of single');
    is($single->min(), 42.5, 'min of single');
    is($single->max(), 42.5, 'max of single');
    is($single->median(), 42.5, 'median of single');
};

# ============================================
# Quadmath-specific precision tests
# ============================================

if ($is_quad) {
    subtest 'quadmath: precision characteristics' => sub {
        # Note: nvec may use double-precision internally even on quadmath perl
        # These tests verify basic functionality works correctly

        # Test that very small values are preserved
        my $small = 1e-15;
        my $v = nvec::new([$small]);
        my $got = $v->get(0);
        ok($got > 0, 'very small value preserved');
        ok(approx_eq($got, $small, 1e-20), 'small value accurate');

        # Test arithmetic with small values
        my $a = nvec::new([1.0]);
        my $result = $a->add_scalar(-1.0);
        is($result->get(0), 0, 'subtraction gives zero');
    };

    subtest 'quadmath: large value handling' => sub {
        my $large = 1e100;
        my $v = nvec::new([$large, $large * 2, $large * 3]);

        ok($v->min() > 0, 'large min is positive');
        ok($v->max() > $v->min(), 'max > min for distinct values');
        ok($v->mean() > $large, 'mean is in expected range');
    };

    subtest 'quadmath: accumulation test' => sub {
        my $n = 100;
        my $v = nvec::zeros(1);

        for (1..$n) {
            $v = $v->add_scalar(1.0);
        }

        my $result = $v->get(0);
        ok(approx_eq($result, $n, $tol), "accumulated sum of $n ones");
    };
}

done_testing();



( run in 0.496 second using v1.01-cache-2.11-cpan-13bb782fe5a )