- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]

From: David A. Case <case.scripps.edu>

Date: Tue, 5 Jul 2005 10:38:09 -0700

On Tue, Jul 05, 2005, Petr Kulhanek wrote:

*>
*

*> When I debug program I just found that some fractional coordinate is
*

*> 1.0. I thought that round errors are responsible for this. OK, I
*

*> analysed the problem in more details and I think that the calculation of
*

*> fractions are not fully correct.
*

*>
*

*> I will assume only one-dimensional case in following consideration.
*

*>
*

*> * fractional coordinate has to be in range from 0.00 to 0.9999..
*

*>
*

*> * dnint(0.5) is 1.0 ( dnint(0.5) = dint(0.5 + 0.5) = dint(1.0) = 1.0 )
*

*> * dnint(0.0) is 0.0 ( dnint(0.0) = dint(0.0 - 0.5) = dint(-0.5) = 0.0 )
*

*> * dnint(-0.5) is -1.0 ( dint(-0.5) = dint(-0.5 - 0.5) = dint(-1.0) = -1.0 )
*

*> (I checked result for dnint(-0.5) also by g77)
*

*>
*

*> * fractional coordinate is calculated by fract = f1 - dnint(f1) + 0.5d0
*

*>
*

*> * if f1 = 0.5
*

*> fract = f1 - dnint(f1) + 0.5d0 = 0.5 - dnint(0.5) + 0.5 = 0.5 - 1.0 +
*

*> 0.5 = 0.0
*

*> this is correct
*

*>
*

*> * if f1 = 0.0
*

*> fract = f1 - dnint(f1) + 0.5d0 = 0.0 - dnint(0.0) + 0.5 = 0.0 - 0.0 +
*

*> 0.5 = 0.5
*

*> this is correct
*

*>
*

*> * if f1 = -0.5
*

*> fract = f1 - dnint(f1) + 0.5d0 = -0.5 - dnint(-0.5) + 0.5 = -0.5 -
*

*> (-1.0) + 0.5 = 1.0
*

*> this is NOT correct, fract has to be 0.0
*

The only problem I see here is a possible round-off problem: if the the

initial coordinate is exactly -0.5, then the fractional coordinate will be

exactly 1.0, and it may be that this is not allowed by some data structure.

But otherwise, I don't see anything wrong. [Note that a fractional coordiante

of 0.0 is logically the same as a fractional coordinate of 1.0.]

*>
*

*> It is my guess that fract could be calculated correctly only with
*

*> floor() or ceiling() functions...
*

I don't see any easy way to use floor() or ceiling(); the "nearest integer"

(nint) is indeed the function that is required. Clearly, if a fractional

coordinate of exactly -0.5 causes problems, this needs to be trapped in the

code.

....regards...dac

-----------------------------------------------------------------------

The AMBER Mail Reflector

To post, send mail to amber.scripps.edu

To unsubscribe, send "unsubscribe amber" to majordomo.scripps.edu

Received on Tue Jul 05 2005 - 18:53:00 PDT

Date: Tue, 5 Jul 2005 10:38:09 -0700

On Tue, Jul 05, 2005, Petr Kulhanek wrote:

The only problem I see here is a possible round-off problem: if the the

initial coordinate is exactly -0.5, then the fractional coordinate will be

exactly 1.0, and it may be that this is not allowed by some data structure.

But otherwise, I don't see anything wrong. [Note that a fractional coordiante

of 0.0 is logically the same as a fractional coordinate of 1.0.]

I don't see any easy way to use floor() or ceiling(); the "nearest integer"

(nint) is indeed the function that is required. Clearly, if a fractional

coordinate of exactly -0.5 causes problems, this needs to be trapped in the

code.

....regards...dac

-----------------------------------------------------------------------

The AMBER Mail Reflector

To post, send mail to amber.scripps.edu

To unsubscribe, send "unsubscribe amber" to majordomo.scripps.edu

Received on Tue Jul 05 2005 - 18:53:00 PDT

Custom Search