Julia è un linguaggio di uso generale che può essere usato per la maggior parte dei compiti di programmazione. In pratica, però, i casi d'uso principali tendono a essere nell'ingegneria e nella scienza. Calcoli numerici veloci, versatili e sofisticati sono al centro della sua progettazione.
Un numero intero è un numero «tondo», senza punto decimale.
Nel concetto Basi, abbiamo visto che un valore intero può essere assegnato a una variabile senza specificare un tipo.
Per leggibilità, si possono usare i trattini bassi come separatore delle cifre. Il compilatore li ignora.
julia> x = 3
3
julia> typeof(x)
Int64
julia> large_number = 1_234_567_890
1234567890
Non sorprenderà che i numeri in virgola mobile abbiano un punto decimale e una parte frazionaria dopo il punto.
julia> f = 3.45
3.45
julia> typeof(f)
Float64
Naturalmente, la notazione scientifica è supportata.
julia> avogadro = 6.02e23
6.02e23
I valori massimo e minimo potrebbero sorprendere:
julia> typemax(Float64)
Inf
julia> typemin(Float64)
-Inf
L'infinito è un valore valido!
Come discusso nel concetto Basi, gli operatori aritmetici funzionano per lo più come l'aritmetica standard, quella insegnata ai bambini.
Tieni presente che l'elevamento a potenza usa ^, non ** (entrambi sono comuni in altri linguaggi).
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division)
8 % 3 # 2 (remainder)
2 ^ 3 # 8 (exponentiation)
Tuttavia, vale la pena discutere alcuni dettagli specifici di Julia.
julia> x = 4.2
4.2
julia> 2 * x
8.4
julia> 2x
8.4
julia> 2.4x
10.08
Questo potrebbe sorprendere.
È sempre possibile usare * come operatore infisso, come nella maggior parte degli altri linguaggi di programmazione.
Tuttavia, Julia è stata progettata da persone convinte che il codice debba assomigliare il più possibile a equazioni matematiche.
Poiché i nomi delle variabili devono iniziare con una lettera, anteporre un numero (intero o in virgola mobile) al nome viene trattato come moltiplicazione implicita.
Per esempio, se vogliamo l'area della superficie di una sfera, invece di 4 * pi * r * r potremmo fare così:
julia> surface(r) = 4π * r^2
surface (generic function with 1 method)
julia> surface(3)
113.09733552923255
Sebbene π sia una costante integrata nel linguaggio, è anche una lettera (greca).
Il parser ha quindi comunque bisogno di un * esplicito per separare π da r.
Usare / come operatore infisso dà sempre un risultato in virgola mobile, anche per input interi.
Per la divisione intera ci sono più opzioni.
julia> 10 / 3 # floating-point division
3.3333333333333335
julia> div(10, 3) # integer division
3
julia> 10 ÷ 3 # synonym for div()
3
julia> 10 // 3 # rational number (fraction)
10//3
La funzione div() serve per la divisione intera, con il risultato troncato verso lo zero: verso il basso per i numeri positivi, verso l'alto per quelli negativi.
Come sinonimo possiamo usare l'operatore infisso ÷, sempre con l'obiettivo di rendere il tutto più matematico.
Se stai usando un editor che conosce Julia, digita \div e poi premi il tasto <Tab>.
L'operatore // va oltre lo scopo di questo concetto.
Per ora ci basta dire che il risultato di // è un numero «razionale», che la maggior parte delle persone chiama frazione.
Spesso questo può avvenire automaticamente:
julia> x = 2 + 3.5
5.5
julia> typeof(x)
Float64
Abbiamo sommato un Int64 a un Float64 e ottenuto un risultato Float64.
In realtà, l'intero è stato convertito silenziosamente in Float64 prima di eseguire la somma.
Le conversioni da virgola mobile a intero sono inevitabilmente più complicate. Cosa vuoi fare con la parte dopo il punto decimale?
round() converte al numero intero più vicino; nei casi di parità come 4.5, arrotonda al numero intero pari più vicino.floor() arrotonda verso il basso, ceil() verso l'alto, trunc() verso lo zero.Int32(), fallisce con un InexactError.Tuttavia, per impostazione predefinita queste funzioni non restituiscono il tipo intero che forse avresti voluto. È possibile specificare il tipo di output desiderato.
julia> round(4.5)
4.0
julia> ceil(Int, 4.3)
5
È anche possibile arrotondare a un numero specificato di cifre dopo il punto decimale usando la parola chiave digits.
julia> round(π, digits=10)
3.1415926536
Di sicuro questo genera semplicemente un errore? In realtà la situazione non è così semplice.
La divisione intera con ÷ o // produce un errore, come ti aspetteresti.
La divisione in virgola mobile con / adotta quello che si potrebbe considerare un approccio ingegneristico, piuttosto che un approccio informatico standard:
julia> 2 / 0
Inf
julia> 0 / 0
NaN
Come discusso in una sezione precedente, l'infinito è un numero in virgola mobile valido in Julia, rappresentato da Inf.
Quando anche il numeratore è zero, il risultato è matematicamente indefinito.
Julia lo tratta allora come «non un numero», rappresentato da NaN.
Il tuo amico Chandler ha in programma di visitare paesi esotici in giro per il mondo. Purtroppo, Chandler non è bravo in matematica. Teme molto di essere truffato dagli uffici di cambio durante il viaggio, e vuole che tu gli crei un calcolatore di valute. Ecco le specifiche che ha in mente per l'app:
Crea la funzione exchange_money(), che prende 2 parametri:
budget : la somma di denaro che hai intenzione di cambiare.exchange_rate : la quantità di valuta nazionale equivalente a una unità di valuta estera.Questa funzione deve restituire il valore della valuta scambiata.
Nota: se la tua valuta è in USD e vuoi cambiare USD in EUR con un tasso di cambio di 1.20, allora 1.20 USD == 1 EUR.
julia> exchange_money(127.5, 1.2)
106.25
Crea la funzione get_change(), che prende 2 parametri:
budget : la somma di denaro prima del cambio.exchanging_value : la somma di denaro che viene presa dal budget per essere cambiata.Questa funzione deve restituire la somma di denaro che rimane dal budget.
julia> get_change(127.5, 120)
7.5
Crea la funzione get_value_of_bills(), che prende 2 parametri:
denomination : il valore di una singola banconota.number_of_bills : il numero totale di banconote.Questo chiosco di cambio tratta solo contanti in determinati tagli. Il totale che ricevi deve essere divisibile per il valore di una «banconota» o unità, il che può lasciare una frazione o un resto. La funzione deve restituire solo il valore totale delle banconote (escludendo le frazioni) che il chiosco ti darebbe indietro. Purtroppo, il chiosco si tiene il resto come bonus aggiuntivo.
julia> get_value_of_bills(5, 128)
640
Crea la funzione get_number_of_bills(), che prende amount e denomination.
Questa funzione deve restituire il numero di banconote che puoi ricevere entro l'amount dato. In altre parole: quante banconote intere entrano nella somma iniziale? Ricorda: puoi ricevere solo banconote intere, non frazioni di banconota, quindi ricordati di dividere di conseguenza. In pratica, stai arrotondando per difetto alla banconota intera più vicina.
julia> get_number_of_bills(127.5, 5)
25
Crea la funzione get_leftover_of_bills(), che prende amount e denomination.
Questa funzione deve restituire l'importo avanzato che non può essere restituito a partire dall'amount iniziale, data la denominazione delle banconote. È molto importante sapere esattamente quanto si tiene il chiosco.
julia> get_leftover_of_bills(127.5, 20)
7.5
Crea la funzione exchangeable_value(), che prende budget, exchange_rate, spread e denomination.
Il parametro spread è la percentuale trattenuta come commissione di cambio, scritta come numero intero.
Va convertita in decimale dividendola per 100.
Se 1.00 EUR == 1.20 USD e lo spread è 10, il tasso di cambio totale sarà in realtà: 1.00 EUR == 1.32 USD, perché il 10% di 1.20 è 0.12, e questa commissione aggiuntiva si somma al cambio.
Questa funzione deve restituire il valore massimo della nuova valuta dopo aver calcolato il tasso di cambio più lo spread. Ricorda che la denominazione della valuta è un numero intero e non può essere suddivisa.
Nota: il valore restituito deve essere di tipo intero.
julia> exchangeable_value(127.25, 1.20, 10, 20)
80
julia> exchangeable_value(127.25, 1.20, 10, 5)
95
Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.