comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: A bug in MOD ?
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
Re: A bug in MOD ? [message #41177] Mon, 27 September 2004 00:37
Paolo Grigis is currently offline  Paolo Grigis
Messages: 171
Registered: December 2003
Senior Member
Well, IDL does give the right answer (modulo 0.1 of course!)
within the floating point precision limits...

print,(1. mod 0.1),format='(f20.15)'
0.099999986588955
print,abs((1. mod 0.1)-0.1) LT (machar()).eps
1

and of course 0.09999... is approximately equal 0.0000...
(modulo 0.1). So the question would be: why does it matter?
The whole point of taking the modulo is to have numbers near
0.1 being "close neighbours" to numbers near 0.0 anyway...

Paolo

Christopher Lee wrote:
> In article <cj1cqe$gut$1@canarie.caspur.it>, "sandrokan"
> <mura@remove.ifsi.rm.cnr.it> wrote:
>
>
>
>> I don't know much about libs, I only have IDl and another s/w: IDL>
>> print, 1.0 mod 0.1
>> 0.100000
>> but:
>>
>>
>>>> mod(1.0, 0.1)
>>
>> ans =
>> 0
>>
>
> Hi,
>
> Ah, matlab, wonderful matlab.I think Matlab uses arbitrary precision
> math. where this answer is correct. I could be wrong of course.
>
> The answer lies in the floating point representation of 1.0 and 0.1, or
> any number. One of the numbers are really what they appear (not sure
> which one) and the result is that ..
>
> floor(1.0/0.1)=9
> 1.0 mod 0.1 = 0.1
>
> ;these may not work in any known language, but they do show what's
> happening.
>
> Calculating 0.8 mod 0.1, you get the correct answer, because
> whatever representation error exists in 0.8 also exists in 0.1 .similarly
> for 1.0 and 0.5|0.25|0.125 (powers of 2).
>
> This is true of the IDL mod, the C++ fmod call (and probably the C
> library fmodf call, as its used internallyin C++), the fortran mod function, the python
> mod function, etc.
>
> I'm not sure what the correct method would be. I can't really round a
> value to zero when the value is comparable to the denominator in the
> 'mod' equation. It gets worse when I realize I've used 'mod' on a
> floating point before, in FORTRAN code.
>
> Chris.
Re: A bug in MOD ? [message #41182 is a reply to message #41177] Sun, 26 September 2004 01:52 Go to previous message
R.Bauer is currently offline  R.Bauer
Messages: 1424
Registered: November 1998
Senior Member
Christopher Lee wrote:

> In article <cj1cqe$gut$1@canarie.caspur.it>, "sandrokan"
> <mura@remove.ifsi.rm.cnr.it> wrote:
>
>
>> I don't know much about libs, I only have IDl and another s/w: IDL>
>> print, 1.0 mod 0.1
>> 0.100000
>> but:
>>
>>>> mod(1.0, 0.1)
>> ans =
>> 0
>>>>
>
> Hi,
>
> Ah, matlab, wonderful matlab.I think Matlab uses arbitrary precision
> math. where this answer is correct. I could be wrong of course.
>
> The answer lies in the floating point representation of 1.0 and 0.1, or
> any number. One of the numbers are really what they appear (not sure
> which one) and the result is that ..
>
> floor(1.0/0.1)=9
> 1.0 mod 0.1 = 0.1
>
> ;these may not work in any known language, but they do show what's
> happening.
>
> Calculating 0.8 mod 0.1, you get the correct answer, because
> whatever representation error exists in 0.8 also exists in 0.1 .similarly
> for 1.0 and 0.5|0.25|0.125 (powers of 2).
>
> This is true of the IDL mod, the C++ fmod call (and probably the C
> library fmodf call, as its used internallyin C++), the fortran mod
> function, the python mod function, etc.
>
> I'm not sure what the correct method would be. I can't really round a
> value to zero when the value is comparable to the denominator in the
> 'mod' equation. It gets worse when I realize I've used 'mod' on a
> floating point before, in FORTRAN code.
>
> Chris.


Dear Chris,

mod in Fortran and mod in IDL is not the same.

; PROCEDURE:
; modulo(a,b) = a - FLOOR(a/b)*b instead of
; a MOD b = a - LONG(a/b)*b

You could try:
http://www.fz-juelich.de/icg/icg-i/idl_icglib/idl_source/idl _html/dbase
calc_modulo_dbase.pro.html

cheers

Reimar

--
Forschungszentrum Juelich
email: R.Bauer@fz-juelich.de
http://www.fz-juelich.de/icg/icg-i/
============================================================ ======
a IDL library at ForschungsZentrum Juelich
http://www.fz-juelich.de/icg/icg-i/idl_icglib/idl_lib_intro. html
Re: A bug in MOD ? [message #41192 is a reply to message #41182] Fri, 24 September 2004 10:06 Go to previous message
Chris Lee is currently offline  Chris Lee
Messages: 101
Registered: August 2003
Senior Member
In article <cj1cqe$gut$1@canarie.caspur.it>, "sandrokan"
<mura@remove.ifsi.rm.cnr.it> wrote:


> I don't know much about libs, I only have IDl and another s/w: IDL>
> print, 1.0 mod 0.1
> 0.100000
> but:
>
>>> mod(1.0, 0.1)
> ans =
> 0
>>>

Hi,

Ah, matlab, wonderful matlab.I think Matlab uses arbitrary precision
math. where this answer is correct. I could be wrong of course.

The answer lies in the floating point representation of 1.0 and 0.1, or
any number. One of the numbers are really what they appear (not sure
which one) and the result is that ..

floor(1.0/0.1)=9
1.0 mod 0.1 = 0.1

;these may not work in any known language, but they do show what's
happening.

Calculating 0.8 mod 0.1, you get the correct answer, because
whatever representation error exists in 0.8 also exists in 0.1 .similarly
for 1.0 and 0.5|0.25|0.125 (powers of 2).

This is true of the IDL mod, the C++ fmod call (and probably the C
library fmodf call, as its used internallyin C++), the fortran mod function, the python
mod function, etc.

I'm not sure what the correct method would be. I can't really round a
value to zero when the value is comparable to the denominator in the
'mod' equation. It gets worse when I realize I've used 'mod' on a
floating point before, in FORTRAN code.

Chris.
Re: A bug in MOD ? [message #41194 is a reply to message #41192] Fri, 24 September 2004 08:00 Go to previous message
sandrokan is currently offline  sandrokan
Messages: 20
Registered: September 2004
Junior Member
"Christopher Lee" <cl@127.0.0.1> ha scritto nel messaggio
news:20040924.114950.1760281936.25390@buckley.atm.ox.ac.uk.. .
> In article <20040924.113053.971899228.25372@buckley.atm.ox.ac.uk>,
> "Christopher Lee" <cl@127.0.0.1> wrote:
>
>> IDL> print, 1.0 mod 0.1
>> 0.1000000
>> ;should be 0.0

I don't know much about libs, I only have IDl and another s/w:

IDL> print, 1.0 mod 0.1

0.100000



but:

>> mod(1.0, 0.1)
ans =
0
>>





Any idea?



Ale
Re: A bug in MOD ? [message #41196 is a reply to message #41194] Fri, 24 September 2004 03:49 Go to previous message
Chris Lee is currently offline  Chris Lee
Messages: 101
Registered: August 2003
Senior Member
In article <20040924.113053.971899228.25372@buckley.atm.ox.ac.uk>,
"Christopher Lee" <cl@127.0.0.1> wrote:

> IDL> print, 1.0 mod 0.1
> 0.1000000
> ;should be 0.0
> IDL> print, (1.0*!pi) mod (0.1 * !pi)
> 0.00000

IDL> print, (0.8) mod 0.1
0.00000
IDL> print, 1.1 mod 0.1
7.45058e-09 ; =0.0
IDL> print, 1.0 mod 0.5
0.00000

On further testing, C++ gives the same answer. So the bug is somewhere in
my glibc.

Chris.
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Munich Adventures and other Coyote Stories
Next Topic: Integration of 2-D irregularly gridded data

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Wed Oct 08 20:02:37 PDT 2025

Total time taken to generate the page: 0.00407 seconds