Come mi fa girare i polsi C#...

...quando mi restituisce un Int32 dalla divisione fra due Int32!

Public Shared Function TestDiv() As Double
     Dim a As Int32 = 12
     Dim b As Int32 = 10
     Return a / b
End Function

restituisce (giustamente IMHO) un Double = 1,2

public static Double TestDiv()
{
     Int32 a = 12;
     Int32 b = 10;
     return a / b;
}

restituisce comunque un Double ma uguale a 1, che nella crapa di un informatico potrebbe anche avere un suo perchè, ma nel mondo reale è un'eresia!

Print | posted @ venerdì 11 maggio 2007 14:26

Comments on this entry:

Gravatar # re: Come mi fa girare i polsi C#...
by Lorenzo Barbieri at 11/05/2007 14:36

Beh... lui prende il tipo del primo argomento se la memoria non inganna... e quindi... un bel casl in testa su a dovrebbe bastare...
Gravatar # re: Come mi fa girare i polsi C#...
by Mario Duzioni at 11/05/2007 14:46

Si si, ma è proprio il concetto che mi fa incavolare!
Gravatar # re: Come mi fa girare i polsi C#...
by Gian Maria at 11/05/2007 15:13

Ammetto che quando iniziai ad utilizzare C/C++ rimasi anche io stupito da questo comportamento, che però è il più logico. Il processore infatti possiede istruzioni diverse per divisione intera e floating point, anche in termini di performance molto differenti. Il VB restituisce un double dalla divisione intera, questo significa che usa sempre la divisione FloatingPoint, mentre in C# più correttamente se dividi due interi utilizzi la divisione intera, e con un cast gli puoi dire di utilizzare quella floating point, quindi è più flessibile perchè puoi scegliere quella che preferisci.

Dopo un po ci si fa l'abitudine.

Alk.
Gravatar # re: Come mi fa girare i polsi C#...
by Simone Busoli at 12/05/2007 01:41

Credo sia una delle prime frasi che io abbia mai sentito dire sul C, "la divisione fra due interi è un intero". Niente di strano.
Gravatar # re: Come mi fa girare i polsi C#...
by Gian MAria at 12/05/2007 12:27

La divisione ritorna appunto un intero, chiaramente tu hai definito il valore di ritorno come double, per cui lui educatamente te lo riconverte in double.
Capisco per chi proviene da linguaggio come il basic o il pascal sia strano, ma a mio avviso è la cosa più normale. Io al contrario odio il VB che ha due operatori di divisione
/ Divisione floating point
\ divisione intera
prova infatti a fare
Console.WriteLine(10 / 3)
Console.WriteLine(10 \ 3)
e ti accorgi che la seconda versione ti torna 3, ovvero chiama la divisione intera.
Il VB è un linguaggio nato per permettere a tutti di sviluppare per cui per default ti fa la divisione float, che sicuramente è il risultato piu "intuitivo" a scapito delle performance e della correttezza semantica, poi crea l'operatore \ per la divisione intera, a mio avviso un po una porcata :D
Il C#, C++ e anche il java (mi pare xche java non lo conosco bene) invece fanno la cosa più corretta, decidono l'operatore da utilizzare in base al tipo di dato.

ahhhh...la type safety :D

Alk.
Gravatar # re: Come mi fa girare i polsi C#...
by Mario Duzioni at 14/05/2007 14:26

Uff...

Errata corrige: "quello che ti sembra che faccia se conosci l'implementazione reale."

doveva essere "quello che ti sembra che faccia se NON conosci l'implementazione reale."

Ho bisogno di una vacanza... :-)
Comments have been closed on this topic.