Division entière dans awk
Je veux diviser deux nombres awk
en utilisant la division entière, j'.e tronquer le résultat. Par exemple
k = 3 / 2
print k
doit imprimer 1
Selon le manuel
Division; car tous les numéros dans awk sont des nombres à virgule flottante, le résultat est pas arrondi à un nombre entier
Est-il une solution de contournement pour obtenir une valeur entière?
La raison est que je veux obtenir le milieu élément d'un tableau avec entier index [0 à n-1].
source d'informationauteur user000001
Vous devez vous connecter pour publier un commentaire.
Utiliser le
int
fonction pour obtenir la partie entière du résultat, tronqué vers 0. Cela produit l'entier le plus proche pour le résultat, situé entre le résultat et 0. Par exemple,int(3/2)
est de 1,int(-3/2)
est -1.Source: L'AWK Manuel - Fonctions Numériques
Sûr et rapide awk division entière peut être fait avec:
Dans les cas simples, vous pouvez utiliser en toute sécurité
int()
qui tronque vers zéro1:Gardez à l'esprit que awk utilise toujours double-précision des nombres à virgule flottante2 et l'arithmétique à virgule flottante3. La seule façon vous pouvez obtenir des entiers et l'arithmétique des nombres entiers est d'utiliser des outils externes, par exemple la norme
expr
utilitaire:C'est vraiment awkde la paroisse, long, lent, ... mais sûr et portable.
1 Dans POSIX awkla troncature à zéro n'est garanti que pour les arguments positifs: int(x) — retourne l'argument tronqué à un entier. La troncature est vers 0 quand x>0. GNU awk (gawk) utilise la troncature vers zéro, même pour les nombres négatifs: int(x) — Retourne l'entier le plus proche de x, situé entre x et zero et tronquée vers zéro. Par exemple, int(3) est de 3, int(3.9) est de 3, int(-3.9) est -3 et int(-3) -3.
2 expressions Numériques sont précisées en tant que de double précision flotte dans Expressions dans awk dans POSIX.
3 Toutes arithmétique doit suivre la sémantique de l'arithmétique à virgule flottante, comme spécifié par la norme ISO C standard (voir Des Concepts issus de la norme ISO C Standard). — POSIX awk: fonctions Arithmétiques
Si vous choisissez d'utiliser des flotteurs, vous devez savoir à propos de leurs caprices et être prêt à les repérer et éviter les bugs liés. Plusieurs effrayant exemples:
Irreprésentable numéros:
Des erreurs d'arrondi accumulation:
Les erreurs d'arrondi de la ruine des comparaisons:
Précision diminue avec l'ampleur, provoquant une boucle infinie:
Lire plus sur la façon dont les flotteurs de travail:
De Débordement de pile dans les balises virgule flottante wiki
Article de wikipédia Virgule flottante
GNU awk en précision arbitraire – contient à la fois des infos sur la mise en œuvre spécifique et des connaissances générales