2010-10-02 6 views
10

Je peux arrondir les éléments de A aux entiers les plus proches supérieur ou égal à Aplafond le plus proche 50

ceil(A) 

Mais qu'en est si je veux arrondir au 50 plus proche supérieur ou égal à A ?

Par exemple, étant donné le tableau A suivant,

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

Un sous-programme doit retourner les éléments suivants

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

Répondre

15

Vous pouvez simplement diviser par 50, prendre ceil(), et multiplier par 50 à nouveau :

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

Notez que cela pourrait éventuellement introduire des erreurs d'arrondi en virgule flottante, pour les grandes valeurs dans A. –

+0

Meh, alors débarrassez-vous du point décimal après le 50 dans la division. Soit les nombres sont déjà des valeurs à virgule flottante, auquel cas ce problème est déjà apparu ailleurs dans le code, soit les nombres sont des entiers, auquel cas il suffit de se débarrasser de la virgule décimale et maintenant vous faites la division entière et l'addition , auquel cas aucun problème de virgule flottante. Donc je ne vois pas le problème ici. –

+0

Le problème est que les résultats seront incorrects. :-) Par exemple, essayez '77777777777777777' comme entrée: cette méthode donne le résultat incorrect' 77777777777777792', alors que la méthode de module donne correctement '77777777777777800'. –

8

Un moyen facile est d'ajouter un simple complément de chaque numéro de 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 

(Notez que cela ne dépend que de l'arithmétique entière, ce qui évite les erreurs dues à l'arrondi à virgule flottante.)

+2

J'aime ça parce qu'elle exploite l'addition/la soustraction modulo, c'est-à-dire sans multiplication/division. Toutefois, si vous avez une expression complexe à la place de A, vous souhaiterez peut-être revenir à la solution qui utilise la fonction ceil car l'expression ne sera appelée qu'une seule fois dans cette approche. Tous vers l'objectif de la simplicité du code. – user36800