Re: writing an external function in std c++
Gerry Ford wrote:
"Jim Langston" <tazmaster@rocketmail.com> wrote in message
news:Jwauj.420$Pn5.79@newsfe05.lga...
Gerry Ford wrote:
To imitate it, I believe the appropriate c++ inner product would be
around negative 25.
You are not actually showing the fortran function that calculates
the dot product. That fortran source code simply populates 2 arrays
of 4 elements then calls the function dot_product(). It is the
function dot_product you want to code, but you aren't showing the
souce for that. In fortran ** is the power symbol, in C and C++ you can
use the pow
function. Although some number raised to the power of 2 it's just as
simple to multiply the number by itself. Raising a number to the
power of .5 is taking the square root of it. So basically all that
fortran code is filling one array of 4 elements with the square
roots of 1 to 4, the second 4 element array with the squares of 1 to
4, then calling the function dot_product on them which returns a
single number.
You're prettymuch right on all this. I appreciate you talking
through this source for the benefit of those less familiar with my
common C extension of choice.
There isn't fortran code for dot_product, as it comes with the food
over there. That shocked the heck out of me the first time I
realized it. I was given to understand that c++ had likewise, but
not to worry. With what we have for headers, we can write it from
scratch.
double float c++_dot_product (array vec_a , array vec_b, integer
index) {
// declare local vars
res = 0;
term=0;
sum=0;
for (i = 0; i < index; ++ i)
{
term=vec_a(i)*v_b(i);
sum = sum + term;
}
res = powl(sum, .5);
return res;
}
How does one correctly code the caller for this and the external
function itself?
Output of the follow program is:
0
1
1.414213562373095
1.732050807568877
0
1
4
9
Dot Product: 4.716493561705802
#include <cmath>
#include <vector>
#include <iostream>
double dot_product (const std::vector<double>& vec_a, const
std::vector<double>& vec_b)
{
if ( vec_a.size() != vec_b.size() )
{
std::cerr << "Vectors for dot product are not same size!\n";
return 0.0;
}
double sum = 0;
for ( std::size_t i = 0; i < vec_a.size(); ++i )
{
sum += vec_a[i] * vec_b[i];
}
return std::pow(sum, .5);
}
// Following prototype is not needed in this program since
// the definition is above, but would be used in another
// source file without the previous definition.
double dot_product (const std::vector<double>& vec_a, const
std::vector<double>& vec_b);
int main()
{
std::vector<double> vec_a;
std::vector<double> vec_b;
for ( int i = 0; i < 4; ++i )
{
vec_a.push_back( std::sqrt( static_cast<double>( i )) );
vec_b.push_back( i * i );
}
std::cout.precision(16);
std::copy(vec_a.begin(), vec_a.end(),
std::ostream_iterator<double>(std::cout, "\n"));
std::copy(vec_b.begin(), vec_b.end(),
std::ostream_iterator<double>(std::cout, "\n"));
std::cout << "Dot Product: " << dot_product(vec_a, vec_b) << "\n";
return 0;
}
An alternative to the static_cast<double>( i ) is chaning the for loop with
a double.
for ( double i = 0; i < 4.0; i += 1.0 )
{
vec_a.push_back( std::sqrt( i ) );
vec_b.push_back( i * i );
}
--
Jim Langston
tazmaster@rocketmail.com