Roots of a function: Difference between revisions
Content added Content deleted
(Created task, added C++ example) |
(Added Perl version) |
||
Line 39: | Line 39: | ||
sign = ( value > 0 ); |
sign = ( value > 0 ); |
||
} |
} |
||
} |
|||
</pre> |
|||
=={{header|Perl}}== |
|||
<pre>sub f |
|||
{ |
|||
my $x = shift; |
|||
return ($x * $x * $x - 3*$x*$x + 2*$x); |
|||
} |
|||
my $step = 0.001; # Smaller step values produce more accurate and precise results |
|||
my $start = -1; |
|||
my $stop = 3; |
|||
my $value = &f($start); |
|||
my $sign = $value > 0; |
|||
# Check for root at start |
|||
print "Root found at $start\n" if ( 0 == $value ); |
|||
for( my $x = $start + $step; |
|||
$x <= $stop; |
|||
$x += $step ) |
|||
{ |
|||
$value = &f($x); |
|||
if ( 0 == $value ) |
|||
{ |
|||
# We hit a root |
|||
print "Root found at $x\n"; |
|||
} |
|||
elsif ( ( $value > 0 ) != $sign ) |
|||
{ |
|||
# We passed a root |
|||
print "Root found near $x\n"; |
|||
} |
|||
# Update our sign |
|||
$sign = ( $value > 0 ); |
|||
} |
} |
||
</pre> |
</pre> |
Revision as of 02:22, 22 February 2008
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
Create a program that finds an outputs the roots of a given function, range and (if applicable) step width. The program should identify whether the root is exact or approximate.
For this example, use f(x)=x^3-3x^2+2x.
C++
#include <iostream> double f(double x) { return (x*x*x - 3*x*x + 2*x); } int main() { double step = 0.001; // Smaller step values produce more accurate and precise results double start = -1; double stop = 3; double value = f(start); double sign = (value > 0); // Check for root at start if ( 0 == value ) std::cout << "Root found at " << start << std::endl; for( double x = start + step; x <= stop; x += step ) { value = f(x); if ( ( value > 0 ) != sign ) // We passed a root std::cout << "Root found near " << x << std::endl; else if ( 0 == value ) // We hit a root std::cout << "Root found at " << x << std::endl; // Update our sign sign = ( value > 0 ); } }
Perl
sub f { my $x = shift; return ($x * $x * $x - 3*$x*$x + 2*$x); } my $step = 0.001; # Smaller step values produce more accurate and precise results my $start = -1; my $stop = 3; my $value = &f($start); my $sign = $value > 0; # Check for root at start print "Root found at $start\n" if ( 0 == $value ); for( my $x = $start + $step; $x <= $stop; $x += $step ) { $value = &f($x); if ( 0 == $value ) { # We hit a root print "Root found at $x\n"; } elsif ( ( $value > 0 ) != $sign ) { # We passed a root print "Root found near $x\n"; } # Update our sign $sign = ( $value > 0 ); }