Ciao a tutti, ho sviluppato un piccolo programmino per il calcolo dell'integrale definito di una funzione in VB.NET.
Il mio problema è l'estrema imprecisione con cui VB e qualsiasi altro linguaggio di programmazione con cui ho provato (Java, ActionScript, PHP, C), nella somma di due numeri; uno int e l'altro double.
Il codice è il seguente:
Codice PHP:
Private Sub rettangoli()
txtresult.Text += "<RISULTATI tipo='rettangoli'>"
If Not (IsNumeric(TextBox1.Text)) Or Not (IsNumeric(TextBox2.Text)) Or Not (IsNumeric(TextBox3.Text)) Then
txtresult.Text += "ERRORE: TIPO DATI ERRATI"
GoTo exith
End If
Dim a As Integer = CInt(TextBox1.Text)
Dim b As Integer = CInt(TextBox2.Text)
Dim n As Integer = CInt(TextBox3.Text)
Dim h As Double
h = (b - a) / n
Dim ss As Double = 0
Dim xi As Double = a
Do While xi <= (b - h)
ss = ss + h * (4 / (1 + (xi * xi)))
xi = xi + h
txtresult.Text += ("<XI>" & xi & "</XI>" & " <SS>" & ss & "</SS>" & "<H> " & h & "</H>")
Debug.Print(ss)
Loop
Dim sd As Double = 0
xi = a + h
Do While (xi < b)
sd = sd + h * (4 / (1 + (xi + xi)))
xi = xi + h
Loop
Dim hint As Double = (ss + sd) / 2
Dim err As Double = ss - sd
exith:
txtresult.Text += "<RESULT>" & hint & " " & err & "</RESULT></RISULTATI>"
End Sub
L'output di questo programma mostra, con n = 100, alla 80° iterazione è :
Codice PHP:
[...]
<SS>2,65725035665318</SS>
<H>0,01</H>
<XI>0,79</XI>
<SS>2,682119792117</SS>
<H>0,01</H>
<XI>0,8</XI>
<SS>2,70674881742332</SS>
<H>0,01</H>
<XI>0,810000000000001</XI>
<SS>2,73113906132576</SS>
<H>0,01</H>
<XI>0,820000000000001</XI>
<SS>2,75529219217535</SS>
<H>0,01</H>
<XI>0,830000000000001</XI>
<SS>2,77920991520811</SS>
<H>0,01</H>
<XI>0,840000000000001</XI>
<SS>2,80289396991828</SS>
<H>0,01</H>
<XI>0,850000000000001</XI>
<SS>2,82634612751678</SS>
<H>0,01</H>
<XI>0,860000000000001</XI>
<SS>2,84956818847469</SS>
<H>0,01</H>
[...]
Ora, a casa mia 0,8 + 0,01 = 0,81 e non 0,810000000000001.
Da cosa può essere causato questo errore?