Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Piccolo con problema con il tipo float

Reply
Thread Tools

Piccolo con problema con il tipo float

 
 
Matteo Mancini
Guest
Posts: n/a
 
      10-08-2007
Ho iniziato da poco a programmare in ruby, e stavo facendo un piccolo
programma che, dato un sistema di disequazioni, trova i punti comuni a
queste, impostando un problema di programmazione lineare.
Viene chiesto in input prima il numero di disequazioni (vincoli) e
quindi i parametri in questo modo:
ax+by+c>=0
prima il coefficiente di x, quindi quello di y, il termine noto, e
infine un quarto parametro da impostare ad 1 o a -1 per il segno della
disequazione.
Ho provato il seguente sistema:
0.9x+1.5y<=45
x+y<=36
x>=10
y>=0
Quindi inserisco da input:
4 | 0.9 | 1.5 | 45 | -1 | 1 | 1 | 36 | -1 | 1 | 0 | 10 | 1 | 0 | 1 | 0 |
1
I punti in comune calcolati a mano sono:
(10,0) (36,0) (15,21) (10,24)
E qui sorge il problema: il programma mi scarta il punto (15,21) alla
prima disequazione (provate a mano, la verifica!) e la fatidica somma
0.9*0.15+1.5*21-45 ridÃ* nientepocodimenoche 7.105427357601e-015!!!
Fatta numericamente dÃ* 0, eppure il programma sputa fuori questo
risultato!
Sono ore che ci combatto, datemi una mano vi prego!
Grazie in anticipo!


Il file principale è allegato, seguono le due piccole classi che ho
implementato:

point.rb

class Point
attr_reader , :y
def initialize (x,y)
@x=x
@y=y
end
end

diseq.rb

require 'myrbs\point'

class Diseq < Point
attr_reader :t,:s
def initialize (x,y,t,s)
super(x,y)
@t=t
@s=s
end
def solve(a,b)
c=x*a+y*b-t
puts c
if(c*s>=0)
o=1
else
o=0
end
o
end
end

Attachments:
http://www.ruby-forum.com/attachment/603/area.rb

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Matteo Mancini
Guest
Posts: n/a
 
      10-08-2007
I'm sorry, I've posted in the wrong place, could someone delete this
post?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Austin Ziegler
Guest
Posts: n/a
 
      10-08-2007
On 10/8/07, Matteo Mancini <(E-Mail Removed)> wrote:
> I'm sorry, I've posted in the wrong place, could someone delete this
> post?


Nope. ruby-talk.com is a two-way mirroring solution for a mailing list.

-austin
--
Austin Ziegler * http://www.velocityreviews.com/forums/(E-Mail Removed) * http://www.halostatue.ca/
* (E-Mail Removed) * http://www.halostatue.ca/feed/
* (E-Mail Removed)

 
Reply With Quote
 
Jano Svitok
Guest
Posts: n/a
 
      10-08-2007
On 10/8/07, Matteo Mancini <(E-Mail Removed)> wrote:
> Ho iniziato da poco a programmare in ruby, e stavo facendo un piccolo
> programma che, dato un sistema di disequazioni, trova i punti comuni a
> queste, impostando un problema di programmazione lineare.
> Viene chiesto in input prima il numero di disequazioni (vincoli) e
> quindi i parametri in questo modo:
> ax+by+c>=3D0
> prima il coefficiente di x, quindi quello di y, il termine noto, e
> infine un quarto parametro da impostare ad 1 o a -1 per il segno della
> disequazione.
> Ho provato il seguente sistema:
> 0.9x+1.5y<=3D45
> x+y<=3D36
> x>=3D10
> y>=3D0
> Quindi inserisco da input:
> 4 | 0.9 | 1.5 | 45 | -1 | 1 | 1 | 36 | -1 | 1 | 0 | 10 | 1 | 0 | 1 | 0 |
> 1
> I punti in comune calcolati a mano sono:
> (10,0) (36,0) (15,21) (10,24)
> E qui sorge il problema: il programma mi scarta il punto (15,21) alla
> prima disequazione (provate a mano, la verifica!) e la fatidica somma
> 0.9*0.15+1.5*21-45 rid=E0 nientepocodimenoche 7.105427357601e-015!!!
> Fatta numericamente d=E0 0, eppure il programma sputa fuori questo
> risultato!
> Sono ore che ci combatto, datemi una mano vi prego!
> Grazie in anticipo!
>
>
> Il file principale =E8 allegato, seguono le due piccole classi che ho
> implementato:
>
> point.rb
>
> class Point
> attr_reader , :y
> def initialize (x,y)
> @x=3Dx
> @y=3Dy
> end
> end
>
> diseq.rb
>
> require 'myrbs\point'
>
> class Diseq < Point
> attr_reader :t,:s
> def initialize (x,y,t,s)
> super(x,y)
> @t=3Dt
> @s=3Ds
> end
> def solve(a,b)
> c=3Dx*a+y*b-t
> puts c
> if(c*s>=3D0)
> o=3D1
> else
> o=3D0
> end
> o
> end
> end


Hi,

your problem is that floats are not exact. They have limited
precision, and some numbers (especially irrational and with periodic
fractional part) cannot be stored as floats precisely.
Imagine using decimal notation with max 5 digits: 1/3 =3D 0.33333 or
0.33334. therefore 3 * 1/3 =3D 3 * 0.33333 =3D 0.99999 that is 0.00001
less that expected result. Floats are the same except they use binary
notation and more digits.

One way to avoid it is using BigDecimal instead of floats, although
they are much slower.
Sometimes it's possible to live with the small differences.

Notice that in test/unit, they are checking float results to be within
specified tolerance (assert_in_delta).

(My Italian is sufficient to understand your post, but not to reply

Jano

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
float to string to float, with first float == second float Carsten Fuchs C++ 45 10-08-2009 09:47 AM
Problema con ISDN Y CONEXION PPTP ELR Cisco 2 07-28-2005 11:18 AM
problema con vb net e system.net.socket Fabio Cirillo ASP .Net 0 03-29-2005 07:44 PM
Problema con archivos dbx Jose Joaquin de Haro ASP .Net 1 01-28-2005 01:41 PM
Re: float->byte->float is same with original float image. why float->ubyte->float is different??? bd C Programming 0 07-07-2003 12:09 AM



Advertisments