472,956 Members | 2,563 Online

from math import modf

class nco (object):
def __init__ (self, delta):
self.delta = delta
self.phase = 0.0
def __call__ (self):
self.phase += self.delta
f,i = modf (self.phase)
print modf (self.phase)
if (self.phase 1.0):
self.phase -= 1.0
return self.phase

n = nco (0.1)
for x in xrange (100):
print '%.12f' % n()

prints out
[...]
(0.99999999999999978, 0.0) <<< from modf
1.000000000000 << from n()

I'm baffled as to why 'print modf (self.phase)' prints out the first value,
but the result printed in the 2nd case is different. Without any precision
spec on the first print, an approximate float value was printed, but even
with %.12f, the second gives exactly 1.000....

Sep 24 '07 #1
1 1107
On Mon, 24 Sep 2007 14:13:18 -0400, Neal Becker wrote:
from math import modf

class nco (object):
def __init__ (self, delta):
self.delta = delta
self.phase = 0.0
def __call__ (self):
self.phase += self.delta
f,i = modf (self.phase)
print modf (self.phase)
if (self.phase 1.0):
self.phase -= 1.0
return self.phase

n = nco (0.1)
for x in xrange (100):
print '%.12f' % n()

prints out
[...]
(0.99999999999999978, 0.0) <<< from modf
1.000000000000 << from n()

I'm baffled as to why 'print modf (self.phase)' prints out the first value,
but the result printed in the 2nd case is different. Without any precision
spec on the first print, an approximate float value was printed, but even
with %.12f, the second gives exactly 1.000....
Tuples are printed with calling `repr()` on the objects:

In [144]: str(0.1)
Out[144]: '0.1'

In [145]: repr(0.1)
Out[145]: '0.10000000000000001'

In [146]: '%.12f' % 0.1
Out[146]: '0.100000000000'

In [147]: '%.50f' % 0.1
Out[147]: '0.10000000000000000555111512312578270211815834045 410'

Ciao,
Marc 'BlackJack' Rintsch
Sep 24 '07 #2

This thread has been closed and replies have been disabled. Please start a new discussion.