#!/usr/bin/env perl use utf8; use Devel::Assert 'on'; use Utils; use strict; use warnings; our $TEST_BASE = 0.9; sub exponentiation { my ($base, $powerArg) = @_; ::assert($powerArg >= 0); my $power = $powerArg; my $result = 1; while ($power > 0) { $result *= $base; --$power; } # This line will make the result incorrect. $result = -$result; # If power is odd and base is negative, then result should be negative. # Otherwise result should be positive. ::assert((Utils::bitwiseAnd32($power, 1)) == 1 && ($base < 0) ? $result < 0 : $result >= 0); return $result; } MAIN: { for (my $p = 10; $p >= -1; --$p) { print Utils::messageFormat("\{0:f\} ^ \{1:d\} = \{2:f\}", $TEST_BASE, $p, exponentiation($TEST_BASE, $p)), "\n"; } }