2010-10-02 5 views
10

posso arrotondare gli elementi di A agli interi più vicino maggiori o uguali a Asoffitto a 50 più vicina

ceil(A) 

Ma che dire se voglio arrotondare al più vicino 50 maggiore o uguale a A ?

Ad esempio, dato il seguente A matrice,

A=[24, 35, 78, 101, 199]; 

Una subroutine deve restituire il seguente

B=Subroutine(A)=[50, 50, 100, 150, 200]; 

risposta

15

Si può solo dividere per 50, prendere ceil(), e moltiplicare per 50 nuovamente :

octave:1> A=[24, 35, 78, 101, 199]; 
    octave:2> ceil(A) 
    ans = 

    24 35 78 101 199 

    octave:3> 50*(ceil(A/50.)) 
    ans = 

    50 50 100 150 200 
+1

noti che questo potrebbe concepibilmente introdurre in virgola mobile errori di arrotondamento per valori grandi in A. –

+0

Meh, quindi sbarazzarsi del punto decimale dopo il 50 nella divisione. O i numeri sono già valori a virgola mobile, nel qual caso il problema è già presente altrove nel codice, oppure i numeri sono numeri interi, nel qual caso basta eliminare il punto decimale e ora stai facendo divisione in interi e aggiunta , nel qual caso nessun problema in virgola mobile. Quindi non vedo il problema qui. –

+0

Il problema è che i risultati non saranno corretti. :-) Ad esempio, prova '77777777777777777' come input: questo metodo fornisce il risultato errato' 77777777777777792', mentre il metodo modulo fornisce correttamente '77777777777777800'. –

8

Un modo semplice è aggiungere solo il complemento di ogni numero modulo 50:

octave> A = [24, 35, 78, 101, 199] 

octave> mod(-A, 50)  # Complement (mod 50) 
ans = 

    26 15 22 49 1 

octave> A + mod(-A, 50) # Sum to "next higher" zero (mod 50) 
ans = 

    50 50 100 150 200 

octave> A - mod(A, 50) # Can also sum to "next lower" zero (mod 50) 
ans = 

    0  0 50 100 150 

(Si noti che questo dipende solo aritmetica intera, che evita errori dovuti a virgola mobile arrotondamento.)

+2

Mi piace perché sfrutta l'addizione/sottrazione del modulo, cioè senza moltiplicazione/divisione. Tuttavia, se si ha un'espressione complessa al posto di A, è possibile tornare alla soluzione che utilizza la funzione ceil perché l'espressione verrà invocata solo una volta in tale approccio. Tutto verso l'obiettivo della semplicità del codice. – user36800