Numero e operazione matematica che generano un overflow

giovedì 24 agosto 2006 - 14.25

forno Profilo | Junior Member

Ciao a tutti. Sto lavorando alla mia applicazione con il supporto di una DLL esterna. Sulla guida vengo informato che uno dei valori restituiti dalla dll dev'essere elaborato con un'operazione matematica per avere il risultato corretto. Mi viene fornita anche la formula dove # è la variabile:

# * 360 / (65536 * 65536 * 65536 * 65536)

Il problema è che la seconda parte, dopo il simbolo di divisione mi genera un overflow e non riesco a individuarne il motivo.

Suggerimenti?

henry17ttt Profilo | Junior Member

forse viene un numero troppo grande, esattamente 18446744073709551616; che tipo di variabile é quella a cui hai assegnato questo piccolissimo quanto insignificante risultato???
enri

us01739 Profilo | Expert

Prova a definire la variabile come long o int-64
Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

henry17ttt Profilo | Junior Member

prova cosí

# 360 / (65536^4)

enri

us01739 Profilo | Expert

scusa enri,
ma che differenza dovrebbe esserci tra # 360 / (65536^4) e # * 360 / (65536 * 65536 * 65536 * 65536)????????

Il risultato è sempre quello!!!Se non ci stava prima come potrebbe starci ora?

Prova ad usare la una variabile di tipo int-64!!!


Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

henry17ttt Profilo | Junior Member

se provo con 360 / (65536 * 65536 * 65536 * 65536) mi dá il seguente errore:

"Constant expression not representable in type Integer"

se provo con 360/ (65536^4) non dá nessun tipo di errore.

Sto lavorando con Microsoft Visual Studio 2005. puoi verificare anche te.
enri

darisole Profilo | Junior Member

ATTENZIONE!
Che linguaggio usi? In C# il simbolo ^ NON è l'elevazione a potenza, ma tutt'altro.

Comunque puoi provare così:
(int)((long)# * 360L / (long)(65536 * 65536 * 65536 * 65536))

forno Profilo | Junior Member

Dopo una lunga e laboriosa ricerca ho trovato una guida sull'SDK che mi ha dato anche una risposta:

If your compiler supports long long (64-bit) integers then use such a variable to simply copy this 64-bit value into a double floating point variable and multiply by 360.0/(65536.0 * 65536.0 * 65536.0 * 65536.0).

Otherwise you will have to handle the high 32-bits and the low 32-bits separately, combining them into one double floating point value (say dHi). To do, copy the high part (the 32-bit int at 056C) to one double and the low part (the 32-bit unsigned int at 0568) to another (say dLo). Remember that the low part is only part of a bigger number, so doesn’t have a sign of its own. Divide dLo by (65536.0 * 65536.0) to give it its proper magnitude compared to the high part, then either add it to or subtract it from dHi according to whether dHi is positive or negative. This preserves the integrity of the original positive or negative number. Finally multiply the result by 360.0/(65536.0 * 65536.0) to get degrees.

In pratica mi ha fatto dividere in due la variabile e poi ricongiungerla, ora funziona perfettamente.
Grazie a tutti per l'aiuto!
Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5