Stampa i tre risultati, ciascuno su una riga, formattati con due cifre decimali, nell’ordine: Euclidea, City-block, Chessboard.
📌 Importante:
Utilizza le funzioni matematiche standard del tuo linguaggio: math.sqrt, abs (o fabs) e max.
L’output deve contenere solo i numeri (uno per riga), senza testi aggiuntivi.
Consulta un simulatore interattivo per questo esercizio nella Figura 1.11 (grafico con trascinamento dei punti e visualizzazione delle tre metriche).
1.17.1.1 🖼️ Perché è importante? – Costo computazionale
In un’immagine 1000×1000 pixel (1 milione di pixel), calcolare la distanza di ogni pixel da un punto di riferimento richiede 1 milione di operazioni. La scelta della metrica influisce sulle prestazioni:
Metrica
Operazioni per pixel
Costo relativo (1M pixel)
Quando utilizzarla
Euclidea (L2)
2 sottrazioni, 2 moltiplicazioni, 1 somma, 1 sqrt
🔴 Più costosa – sqrt è dispendiosa
Distanza “reale” nello spazio continuo
City-block (L1)
2 sottrazioni, 2 abs, 1 somma
🟡 Moderata – senza radice quadrata
Griglie, robotica, immagini binarie
Chessboard (L∞)
2 sottrazioni, 2 abs, 1 max
🟢 Più efficiente
Movimenti di pezzi, morfologia
La funzione sqrt è computazionalmente più costosa rispetto ad operazioni come addizione, sottrazione, moltiplicazione e valore assoluto. Nelle CPU moderne, la differenza può essere piccola (circa 1,5× a 3×), ma nei sistemi embedded o nei cicli di milioni di iterazioni, qualsiasi guadagno conta. Per questo motivo, quando l’obiettivo è solo confrontare le distanze (es.: trovare il punto più vicino), utilizza la distanza euclidea al quadrato.
1.17.1.2 📋 Compito (specifica per VPL)
Input:
Un’unica riga con quattro numeri reali: Ax Ay Bx By
Output:
Tre righe, ciascuna con un numero reale con due cifre decimali (Euclidea, City-block, Chessboard).
1.17.1.3 📌 Esempi
Input
Output
Osservazione
0 0 3 4
5.00 7.00 4.00
Triangolo 3-4-5
0 0 1 1
1.41 2.00 1.00
Diagonale unitaria
Esempio di test di sqrt in Python, con timeit che isola ogni operazione:
%%writefile tmp/mm_out_1.cpp// Benchmark: soma simples vs soma + sqrt#include <chrono>#include <cmath>#include <iostream>int main() { const longlong N =50000000;//50 milhões// Mide o tempo apenas da soma auto t0 = std::chrono::high_resolution_clock::now();for (longlong i =0; i < N;++i) { double a =3.0, b =4.0; volatile double resultado = a + b;// evita otimização } auto t1 = std::chrono::high_resolution_clock::now(); double t_soma = std::chrono::duration<double>(t1 - t0).count();// Mide o tempo da soma + sqrt t0 = std::chrono::high_resolution_clock::now();for (longlong i =0; i < N;++i) { double a =3.0, b =4.0; volatile double resultado = std::sqrt(a*a + b*b);// evita otimização } t1 = std::chrono::high_resolution_clock::now(); double t_sqrt = std::chrono::duration<double>(t1 - t0).count(); std::cout <<"Soma simples : "<< t_soma <<" s\n"; std::cout <<"Soma + sqrt : "<< t_sqrt <<" s\n"; std::cout <<"Razão (sqrt/soma) : "<< (t_sqrt/t_soma) <<"x\n";return0;}