• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 346
  • Last Modified:

PI

VC5, WinNT4.0

I know that #define PI      3.14159 would be good enough in my programme.

Does it make any sense if i do something like this?
What is the effect on the compiler/linker ?

#define PI      3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679



Leow  
0
engllf
Asked:
engllf
  • 5
  • 3
1 Solution
 
nietodCommented:
first of all, don't use #define to define constatnts in C++, that has been replaced with a safer mechansim

const double PI = 3.14.....

To answer your question, if you make it longer, you will have automatically more accuracy if you port the program to a system that has floating point numbers with additional accuracy.  
0
 
The_BrainCommented:
It would depending on.  
The calculation which you are doing.

for instance

void main()
{
  float answer;
  cout<<answer*PI;
}

it would be 12 dec places.  I not sure about that.  you can set it cout.precision(x);
don't use define though.  use const double Pi=3.14159 etc

but if not float, if double then 18 digits precision by default.

So if you use your define, then float would be appropiate.
else define it more accurately, (because)
cout<<PI+(double)
3.14159000000000
etc.

so be more accurate for double 18 dec places is enough. float 11-12 is enough. etc.  it depend on what you want to do.  for the sake of accuracy more dec places is better.  not more than 18, that would be useless.

0
 
nietodCommented:
you can also get the desited accuracy using an expression, like

const double PI = acos(-1);


0
Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

 
nietodCommented:
>> for the sake of accuracy more dec places is better.  not more than 18, that would be useless
The C++ standard only defines minimum requirements on the accuracy of floating point values.  Some implimentations may define more accurate floating point values.  Many mainframes have 16 byte floating point numbers that have accuracy greater than 30 decimal digits. (That is what mainframes are still used for.)
0
 
The_BrainCommented:
Ok fine, pick the easy way out of defining PI :)
acos(-1), fine be like that :):):):)
0
 
RONSLOWCommented:
have a look at

http://snippets.org/#section1group11

Various ways of computing PI to ridiculous lengths

acos(-1) cannot be used globally, because acos(-1) is not a constant expression.  Or am I mistaken here?

0
 
The_BrainCommented:
yup.
acos(-1) is a constant expression. don't be ridiculous, if I am wrong please as a mathemitician and programmer i would LOVE to see why.... I am very interested. :)
0
 
nietodCommented:
you can use

const int PI = acos(-1);

globally.  There is not guarantee that the acost(-1) will be calculated at compile time and embedded as a constant like it would be with

const int PI = 3.14159;

but if, not it will be calculated one time at program start-up which is not big deal.
0
 
nietodCommented:
engulf, are you going to grade this question?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now