|Message: Re: strange behaviour for "deg" unit||Not Logged In (login)|
Click on the Forum title, e.g. on the "Forums by Category" page, to read a sequence of postings to the Forum and its threads all in one page. If you are only interested in one thread or the thread following a specific posting, click the thread or the posting, which takes you to a smaller page, which contains only the part you are interested in and may be easier to navigate.
Messages are "chained" if there are only replies at the first level, i.e. 1/1.html, 1/1/1.html etc. In case of "chained" messages the message number is replaced by the icon and there is no indentation.
Inline: Display the subject line only or also the text of the posting(s); for the choice "All" the "Outline" choices are switched off.
|1||0||1||no text / full text of posting|
|2||1||All||text for level 1 only / text for All postings|
Outline: Choose the depth of the posting thread, successive toggle controls provide increasing detail.
|1||2||1||2 levels / 1 level (original posting)|
|2||3||2||3 levels / 2 levels|
|3||3||All||3 levels / all levels (all postings)|
On Wed, 11 Aug 2010 19:27:01 GMT, maurizio wrote:
> consider these 3 lines: > > G4double arg_theta = 30.0*deg; > G4int theta_slider_pos = 20.0*(arg_theta/deg); > cout << 20*arg_theta/deg << " " << theta_slider_pos << endl; > > Normally we'd expect this to output "600 600". However it outputs "600 > 599".
From CLHEP/Units/SystemOfUnits.h (the G4 names are just the CLHEP names with "using CLHEP" directives), we discover the definitions
// // Angle // static const double radian = 1.; static const double milliradian = 1.e-3*radian; static const double degree = (3.14159265358979323846/180.0)*radian; [...] static const double deg = degree;
So you see that degree is defined as pi/180 (on my MacBook, that string of digits is the same as M_PI).
Your code above is doing double->int conversion. That means a floating point value is _truncated_, not rounded. I am able to reproduce your results, and by using "fixed" and "setprecision(30)," you can see what's going on:
20.0*(arg_theta/deg) = 600 20.0*(arg_theta/deg) = 599.999999999999886313162278383970 theta_slider_pos = 599 int(20*(arg_theta/deg)) = 599 int((20*arg_theta)/deg) = 599