|
i tried using array but seem it not working can u please help me out with code making modification...actual thing what i want is to do the summation of all the generated random number which is store at b.
|
|
|
|
|
#include <stdio.h>
#define N 5
double summation(double g[], int size);
int main()
{
double a[N] =
{
0.035679,
0.079935,
0.033320,
0.042424,
0.012387
};
double s[N];
int i;
for (i=0; i<N; ++i)
{
s[i] = a[i]*a[i];
}
printf("summation = %g\n", summation(s,N));
}
double summation(double g[], int size)
{
int i;
double sum =0.0;
double c=0.0;
for(i=0; i<size ;i++)
{
double y = g[i] -c;
double t = sum + y;
c = (t-sum) - y;
sum = t;
}
return sum;
}
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Consider the following implementation of a summation function and various ways of creating/populating an array for it to work on.
1. static data declared at compile time
2. dynamic data allocated with the c function malloc
3. dynamic data allocated with the c++ operator new
#include <cstdlib>
#include <cstdio>
float sumArrayElements(float array[], int numItems)
{
int i;
float result = 0;
for (i=0; i<numItems; i++)
result += array[i];
return result;
}
int main ()
{
float array1[5] = {10.2, 13.7, 14.8, 99.0, 0.0};
float arraySum1 = sumArrayElements( array1, 5);
printf("Array sum: %.2f\n",arraySum1);
int i;
float *array2;
int dynamicCount1 = 5;
array2 = (float*)malloc(dynamicCount1 * sizeof(float) );
for (i=0; i<dynamicCount1; i++)
array2[i] = (float)rand()/(float)(RAND_MAX);
float arraySum2 = sumArrayElements( array2, dynamicCount1);
free(array2);
printf("Array sum: %.2f\n",arraySum2);
int dynamicCount2 = 10;
float *array3 = new float[dynamicCount2];
for (i=0; i<dynamicCount2; i++)
array3[i] = (float)rand()/(float)(RAND_MAX);
for (i=0; i<dynamicCount1; i++)
array3[i] = (float)rand()/(float)(RAND_MAX);
float arraySum3 = sumArrayElements( array3, dynamicCount2);
delete array3;
printf("Array sum: %.2f\n",arraySum3);
return 0;
}
|
|
|
|
|
thanks for your contribution but this is the logic i apllied for summation 'result +=array[i]' but this is giving the approximate answer not the exact one.
|
|
|
|
|
Except for a rather small subset of numbers, calculations with computers involving floating-point numbers are approximate.
Integer arithmetic doesn't suffer from this pitfall.
However, if you are talking about the result of the code I posted - then consider reviewing the printf statements - in each of them I have used the %.2f format specifier to tell printf to only print 2 digits after the decimal place. The point is - the answer is as close to exact as floats will give you, it is only the display that is (grossly) approximate.
You can get a less approximate result printed if you change the print specifiers to %f
|
|
|
|
|
As far as I can understand, he is trying to imlpement the "Kahan summation algorithm"[^].
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
CPallini i have given just for 5 number as demo but in real my count is above 60000 ?and i am searching for the summation for all the 60000+ value which give correct result.it wouldt be possible for what?
|
|
|
|
|
You cannot modify my program for processing more items, can you?
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
thank you finally i got it after full torture to u and others too..
|
|
|
|
|
You are welcome.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Seems like a reasonable assumption to me. I'd seen your mention of it earlier, but hadn't seen a confirmation of this so guessed (wrongly?) where the problem lay.
Thanks for the impetus to re-investigate the method - I seem to remember using it for something a while back, but brain-rot defeats me..
|
|
|
|
|
can u please kindly explain your assumption?becoz een though i put %.2f its doesnot seem much change in the answer that y..
|
|
|
|
|
Certainly.
Both your code and the pseudo-code in the wiki page that CPallini linked to appear quite similar. This, combined with your mention of the result only being an approximation seems to further support your need for a more accurate result of summing. (which the method may facilitate)
modified 30-Jul-14 8:12am.
|
|
|
|
|
omg u were right ,finally i got the problem was only with the where i gave the print statement..
|
|
|
|
|
hi,
I don't know what's the use of summation in your code. If you want summation of float numbers generated numbers only means, the following piece of code is enough i guess.. See once
srand(12345);
float z=0.0;
float a=0.2,y=0.0;
int i;
for(i=0;i<5;i++)
{
float b=((float)rand()/(float)(RAND_MAX))*a;
printf("%f\n",b);
z=z+b;
}
printf("summation:\n%f\n",z);
|
|
|
|
|
Hi, dear all,
I don't where should I put my Fortran question, so I put it here.
I have a program created 15 years ago by Fortran 4. They only have source files (.for) but didn't have workspace.
I create a new project workspace in Fortran 4 and can compile it, but when I try to print project name on screen by calling Write(*, *), I get access violation error, but if I write to a file by calling Write(2,*), it works fine.
since I didn't have original workspace, I don't know what setting should I set to make it work.
Does anybody know what's the problem?
Thank you very much
|
|
|
|
|
Andraw111 wrote: I don't where should I put my Fortran question, so I put it here. Have you tried here?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Dear all,
Consider the following code:
class Person
{
Person *parent;
public:
Person(Person *p){parent = p;}
};
int main()
{
Person grandfather(nullptr);
Person father(&grandfather);
Person son(&father);
return 0;
}
The inter-object relationship works fine, as long as I don't pass the objects around as function arguments (e.g. pass by value) or clone the objects. If I want to pass them as function parameters, or make a clone of the three objects, without breaking their relationships, what should I do?
Thanks.
Milan.
|
|
|
|
|
Maybe a std::shared_ptr can be helpful for you.
You can use it as follows:
#include <memory>
using namespace std;
class Person
{
shared_ptr<Person> parent;
public:
Person(shared_ptr<Person> p) {parent = p;}
};
void DoSomething(shared_ptr<Person> p)
{
}
int main()
{
shared_ptr<Person> grandfather = make_shared<Person>(nullptr);
shared_ptr<Person> father = make_shared<Person>(grandfather);
shared_ptr<Person> son = make_shared<Person>(father);
DoSomething(father);
return 0;
}
|
|
|
|
|
You just beat me to it.
«_Superman_»
I love work. It gives me something to do between weekends.
Microsoft MVP (Visual C++) (October 2009 - September 2013) Polymorphism in C
|
|
|
|
|
Not sure what exactly is not working for you, but if object lifetime is the problem, you could use shared_ptr .
class Person
{
shared_ptr<Person> parent;
public:
Person(shared_ptr<Person> p){ parent = p; }
};
int main()
{
auto grandfather(make_shared<Person>(nullptr));
auto father(make_shared<Person>(grandfather));
auto son(make_shared<Person>(father));
return 0;
}
«_Superman_»
I love work. It gives me something to do between weekends.
Microsoft MVP (Visual C++) (October 2009 - September 2013) Polymorphism in C
|
|
|
|
|
If you want to use them as function parameters, pass them by reference, not by value.
void function1(Person p)
{
}
void function2(Person& p)
{
}
If you use shared_ptr , remember that you have to make every Person who will be a parent a shared_ptr , otherwise its child will try to delete it (which it has no right to do) when the last goes out of scope.
If you want to create a clone of a Person, and clone its relations, you will need to think hard about lifetime management and ownership. What should happen if you tried to clone father? Should it create a clone of grandfather? That is quite simple to do, but it means father will have to delete its grandfather clone in its destructor. Then what happens if another Person has that grandfather as a parent?
|
|
|
|
|
I can't possibly be ClistCtrl because if I do
(ClistCtrl *)GetDlgItem(...) and then try to insert items and columns (via the documented member functions of CListCtrl, absolutely nothing happens. The list box control remains resolutely blank.
|
|
|
|
|
The MFC class corresponding to the listbox control is CListBox .
If you look carefully you will find there are 2 different controls - List Box and List Control.
«_Superman_»
I love work. It gives me something to do between weekends.
Microsoft MVP (Visual C++) (October 2009 - September 2013) Polymorphism in C
|
|
|
|
|
<blockquote class="quote"><div class="op">Quote:</div>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,int *argv[])
{
srand(12345);
int i,j;
float a=0.2;
double x;
double sqrt(double);
printf("========================================================\n");
printf("Generated random number\t || Squaring of random number:\n");
printf("=========================================================\n");
for(i=0;i<100;i++)
{
double f= ((float)rand()/(float)(RAND_MAX))*a;
printf("%f\t",f);
printf("\t\t%f\n",x*f);
}
FILE *fout;
fout=fopen("R_Number","w");
j=0;
srand(12345);
while(j<100)
{
double f= ((float)rand()/(float)(RAND_MAX))*a;
fprintf(fout,"%f\t\t\t%f\n",f,f*f);
j++;
}
fclose(fout);
return 0;
}
double sqrt (double f)
{
double x, z, tempf;
unsigned long *tfptr = ((unsigned long *)&tempf) + 1;
tempf = f;
*tfptr = (0xbfcdd90a - *tfptr)>>1;
x = tempf;
z = f*0.5;
x = (1.5*x) - (x*x)*(x*z);
x = (1.5*x) - (x*x)*(x*z);
return x*f;
}
</blockquote>
|
|
|
|