7
votes

nombre carré dans la programmation

Je sais que c'est probablement une question très simple, mais comment ferais-je faire quelque chose comme n 2 dans une langue de programmation?

est-ce n * n? Ou y a-t-il un autre moyen?


1 commentaires

N * N est le plus simple, le plus rapide et probablement aussi le plus facile à comprendre.


5 Réponses :


5
votes

n * n code> fonctionnera presque toujours - les cas de couple où il ne fonctionnera pas sont dans les langues de préfixes (Lisp, schéma et co.) ou postfix Langues (en avant, facteur, BC , DC); Mais évidemment, vous pouvez simplement écrire (* nn) code> ou nn * code> respectivement.

Il échouera également quand il y a un cas de débordement: P>

#include <limits.h>
#include <stdio.h>
int main()
{
    volatile int x = INT_MAX;
    printf("INT_MAX squared: %d\n", x * x);
    return 0;
}


6 commentaires

ou un ^ ou un opérateur ** qui vous permet de faire x = n ^ 2 ou x = n ** 2 , mais c'est la même chose que la fonction pow .


@FrustratedwithFormsDesigner: ^ est utilisé pour le bitwise xor dans la plupart des langages de programmation afin que cela soit utilisé avec soin.


@Felix: bon point, je suppose que cela montre à quelle fréquence j'utilise xor . ;-)


@FrustratedwithFormsDesigner: :-D


"Presque" fonctionne toujours? S'il vous plaît citer un exemple où il ne doit pas ou supprimer le qualificatif inutile.


@duffymo lisp / schéma le voudra en notation de préfixe: (* n n). J'ai l'impression que la plupart des langues de montage se plainent aussi :-)



12
votes

n * n est le moyen le plus simple.

Pour les langues prenant en charge l'opérateur de l'exponentiation ( ** dans cet exemple), vous pouvez également faire n ** 2

Sinon, vous pouvez utiliser une bibliothèque de mathématiques pour appeler une fonction, telle que POW (n, 2) mais qui est probablement surchargé pour passer simplement un numéro de squalage.


0 commentaires

3
votes

Il existe de nombreuses langues de programmation, chacune avec leur propre façon d'exprimer des opérations mathématiques.

Certains ordinaires seront: xxx

Si vous spécifiez une langue spécifique, Nous pouvons vous donner plus de conseils.


1 commentaires

Mais vous devriez ajouter que dans La plupart des langages de programmation , ^ est utilisé pour Bitwise xor .



2
votes

si n code> est un entier: Pre> xxx pré>

pour des entiers positifs, vous pouvez utiliser la récursive: p> xxx pré> Calculer à l'aide d'une allocation de matrice (extrêmement sous-optimale): p> xxx pré>

Utilisation du décalage de bits (multiplication égyptienne antique): p> xxx pré> Assemblage: P>

  int x = 10;
  _asm_ __volatile__("imul  %%eax,%%eax"
                     :"=a"(x)
                     :"a"(x)
                      );
  printf("x*x=%d\n", x);


5 commentaires

... Parce que parfois, il n'y a pas une bibliothèque qui l'a déjà fait. ;)


Hmm, beaucoup de votes en bas. Je ne comprends pas. L'utilisateur n'a pas demandé de manière optimale mais pour une autre manière ... :)


Franchement, je suis plutôt surpris (et oui, un peu déçu aussi, je suppose) que cela ne se soit pas transformé en un défi de golf des calculatrices d'exposition les plus convoluées et obscurées.


@Frustrated Il ne devient guère plus de golf que n * n (même J prend 3 caractères *: n )


@Frustrated Voici un peu de shift.



1
votes

Utilisez toujours la multiplication de la langue, à moins que la langue ait une fonction explicite carré . Évitez spécifiquement d'utiliser la fonction pow fourni par la plupart des bibliothèques de mathématiques. La multiplication (sauf dans les circonstances les plus scandaleuses) toujours plus rapides et - si votre plate-forme est conforme à la spécification IEEE-754, laquelle la plupart des plates-formes se produisent - fournira un résultat correctement arrondi. Dans de nombreuses langues, il n'y a pas de norme régissant la précision de la fonction pow . Il donnera généralement un résultat de haute qualité à un cas aussi simple (de nombreuses implémentations de la bibliothèque seront spéciales de sauter de manière à sauver les programmeurs d'eux-mêmes), mais vous ne voulez pas dépendre de cela [1].

Je vois un une quantité énorme de code C / C ++ dans lequel les développeurs ont écrit: xxx

vraisemblablement pour éviter de taper cette expression compliquée deux fois ou parce qu'ils pensent que cela ralentit en quelque sorte leur code d'utilisation temporaire variable. Ce ne sera pas. Les compilateurs sont très, très bien pour optimiser ce genre de chose. Au lieu de cela, écrivez: xxx

à résumer: utilisez la multiplication. Il sera toujours au moins aussi rapide et au moins aussi précis que tout ce que vous pouvez faire [2].

1) Les compilateurs récents sur les plates-formes grand public peuvent optimiser pow (x, 2) dans x * x lorsque la sémantique de la langue le permet. Toutefois, tous les compilateurs ne le font pas dans tous les paramètres d'optimisation, qui est une recette pour les erreurs d'arrondi difficiles à déboguer. Mieux vaut ne pas en dépendre.

2) pour les types de base. Si vous souhaitez vraiment y entrer, si la multiplication doit être implémentée dans des logiciels pour le type que vous collaborez, il existe des moyens de faire une opération de quadrillage plus rapide que la multiplication. Vous ne vous retrouverez presque jamais dans une situation où cela compte, cependant.


0 commentaires