La différence entre les 2 numéros
J'ai besoin de la parfaite algorithme ou C# fonction pour calculer la différence (distance) entre 2 nombres décimaux.
Par exemple la différence entre:
100 et 25 est 75
100 et -25 est 125
-100 et -115 est 15
-500 et 100 est 600
Est-il un C# fonction ou d'un très élégant algorithme pour le calcul de cette ou je dois aller et traiter chaque cas séparément avec sis.
Si il ya une telle fonction ou un algorithme, qui est-ce?
- Les exemples que vous donnez sont tous les nombres entiers - est-ce le cas pour tous les numéros dont vous test ou certains sont à virgule flottante? Si oui, alors vous pourriez avoir à régler pour les tests lorsqu'ils sont "assez proche" - c'est à dire de vérifier si la différence est inférieure à un certain seuil.
- pourquoi downvoted? cela semble être une question juste pour quelqu'un de familier avec les Mathématiques.Abs
- +1, pas besoin de downvoting parfaitement ok question
- Je pense que le membre de phrase "ou je dois aller et traiter chaque cas séparément avec les fi." montre bien cette question a été posée de la langue dans chhek
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire comme ceci
(nr1 - nr2) = Int32.MinValue
- question hereInt32.MinValue
. La raison pour laquelle cela se produit est très banal comme indiqué ici. La gamme de nombre de types de données est toujours comme-x
à(x-1)
. Bien sûr, si j'essaie d'accueillir+x
(valeur absolue deInt32.MinValue
) dans le même type de données pour obtenir la valeur absolue alors qu'il est lié à l'échec 🙂value1-value2
est égal àInt32.MinValue
en raison deSystem.OverflowException
exception. Plus de détails ici.Int32.MinValue
. La raison pour laquelle cela se produit est très banal comme indiqué ici. La gamme de nombre de types de données est toujours comme-x
à(x-1)
. Bien sûr, si j'essaie d'accueillir+x
(valeur absolue deInt32.MinValue
) dans le même type de données pour obtenir la valeur absolue alors qu'il est lié à l'échec.Juste en ajoutant cette, que personne n'a écrit ici:
Alors que vous pouvez certainement l'utiliser
qui est la solution la plus simple (et accepté de répondre), je me demande personne n'a écrit sur ce que l'Abs ne fait. Voici une solution qui fonctionne dans Java, C, C# et tous les autres langage avec une syntaxe de type C:
C'est aussi simple que cela. Vous pouvez aussi l'écrire comme ceci:
Le dernier pourrait être encore plus rapide une fois qu'il est compilé; les deux ont un si et une soustraction, mais le premier a une multiplication dans certains cas, le dernier n'a pas. Pourquoi seulement dans certains cas? Certains Processeurs ont un "swap signe" de l'opération et le compilateur reconnaît que
*= -1
ne sert qu'à des swaps de le signe, donc au lieu d'une multiplication, il sera question d'un échange signer le fonctionnement pour les Processeurs qui l'offrir, et cette opération est aussi rapide qu'un PROCESSEUR opération peut obtenir (généralement un seul cycle d'horloge).Le premier exemple de code est en train de faire ce que l'Abs est en train de faire dans la plupart des implémentations de faire usage de "swap signe" où la prise en charge, le dernier sera plus rapide que sur les Processeurs qui n'ont pas de "swap signe" et de multiplications sont plus chers que les ajouts (sur les Processeurs modernes, ils sont souvent tout aussi rapide).
number1
est100
etnumber2
est-100
:100 - (-100) = 200
ce qui est correct. Ou voir ce(-50) - (-80) = 30
, ce qui est correct, trop. La raison pourquoi il ne fonctionne pas pourint.MaxValue
etint.MinValue
est parce que la différence entre les deux est4'294'967'295
mais le plus grand nombre qui s'inscrit dans uneint
est2'147'483'647
et donc vous causer un débordement de deux fois.result = -result
au lieu deresult *= -1
. C'est ce que l'-
(négatif) de l'opérateur est, après tout.Je ne pense pas que c'est possible en C#, vous pouvez avoir besoin de regarder en œuvre en Assembleur
C'est comment je le fais dans des projets d'entreprise:
et de tests: