Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB.net] problema con il tipo double

    Volevo fare un programmino che mi trovava il perimetro dati i lati di un trapezio, ma quando eseguo mi da un errore:

    Overflow di un operazione aritmetica

    codice:
    Sub TrovaPerimetro()
    
            Dim x As Int16 'lato x
            Dim y As Int16 'lato y
            Dim z As Int16 'lato z
            Dim p As Int16 'semiperimetro
    
            Dim area as Double
    
            For x = 1 To 20
                For y = 1 To 20
                    For z = 1 To 20
                        p = (x + y + z) / 2
                        If x < p And y < p And z < p Then
                            
    
    'l' errore è in questa riga:
    area = p * (p - x) * (p - y) * (p - z) End If If area = 270 ^ 2 Then Numeri.Items.Add("x: " & x & " y: " & y & " z: " & z) End If Next Next Next End Sub
    Volevo sottolineare che se uso numeri più piccoli non ho l' errore ma a me servono numeri grandi.

    Qualcuno sa risolvere il problema? Grazie anticipatamente
    jabjoint

  2. #2
    Ho risolto aggiungendo delle variabili, come se VB non riesce a gestire tutto in una variabile, comunque ora funziona:

    codice:
        Sub TrovaPerimetro()
    
            Dim x As Int16 'lato x
            Dim y As Int16 'lato y
            Dim z As Int16 'lato z
            Dim p As Int16 'semiperimetro
    
            Dim area As Double
    
            'For x = 1 To 125
            x = 36
            For y = 1 To 125
                For z = 1 To 125
                    p = (x + y + z) / 2
                    If x < p And y < p And z < p Then
                        Dim dx As Double = p - x 'differenza p-x
                        Dim dy As Double = p - y 'differenza p-y
                        Dim dz As Double = p - z 'differenza p-z
                        area = p * dx * dy * dz
                    End If
                    If area = 270 ^ 2 Then
                        Numeri.Items.Add("x: " & x & " y: " & y & " z: " & z)
                    End If
                Next
            Next
            'Next
        End Sub
    jabjoint

  3. #3
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Bè, se stai usando VB.NET 2010, puoi usare la classe BigInteger del namespace Numerics. Essa rappresenta un numero la cui grandezza è limitata solo dalla quantità di memoria disponibile.

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  4. #4
    Grazie terrò in considerazione in caso di necessità
    jabjoint

  5. #5
    Il problema è che stai usando degli Int16, per cui viene usata l'aritmetica per interi a 16 bit, che vanno in overflow superato il valore 32767. Per questo genere di conti ti conviene usare i Double.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.