2010-01-14 7 views
5

pourquoi avons-nous besoin des nombres entiers et flottants dans le processeur? Merciflottant et entiers ....?

+2

Ça sent le devoir. –

+1

Je pense vraiment que c'est une bonne question. Lorsque vous avez été dans l'entreprise assez longtemps, vous prenez certaines choses pour acquis. C'est une bonne idée de remettre en question vos hypothèses de temps en temps. –

+1

J'ai remixé cette question. Ça sent le travail à la maison, mais ça a sûrement généré une petite tempête de discussion et je ne pense pas que tout le monde soit un étudiant. Je sais que je ne suis pas, bien que je travaille de la maison aujourd'hui. –

Répondre

0

Ils sont tous que des chiffres, vous pourriez penser que vous n'avez pas besoin de faire la distinction. Mais, dans de nombreux langages, il y a une optimisation possible quand on fait des nombres entiers - l'addition, la soustraction, la multiplication et la division sont possibles avec les instructions CPU. De même, il y a des instructions qui simnilar opérations sur des nombres à virgule flottante, mais parce que les nombres sont représentés différemment dans la machine, et les opérations sont différentes, alors il est logique de faire la distinction entre les entiers et les flottants le langage de programmation lui-même.

C#, Java, C++ et d'autres langages ont tous des types distincts pour la gestion des entiers par rapport aux flottants. Javascript fait le choix inverse - il n'y a pas de type entier spécial, et si je ne me trompe pas, tous les nombres sont flottants.


Quant à savoir pourquoi vous avez besoin ints et flotteurs - flotteurs permettent une gamme beaucoup plus large de valeurs, mais à des fins extrêmes (par exemple, des quantités astronomiques) la précision tombe. Vous ne pouvez pas représenter exactement 1.37999933247474x10e24 en calcul à virgule flottante. D'autre part, les ints offrent précision et rapidité pour un ensemble fixe de nombres.

0

Les entiers sont plus faciles sur les ressources du processeur et sont souvent plus rapides. C'était un gros problème il y a de nombreuses années, lorsque les processeurs ne disposaient même pas de capacités de virgule flottante intégrées. Pas tellement maintenant, mais les différences peuvent encore être significatives dans un code serré.

Les entiers sont souvent tout ce dont vous avez besoin.

0

Les valeurs de virgule flottante ont une portée [beaucoup] plus grande que les entiers. En outre, ils peuvent représenter des valeurs fractionnaires. Ces caractéristiques sont toutefois fournies au prix d'une perte de précision.

Modifier: (ce que je veux dire par perte de précision)
arithmétique entière est toujours exacte, si longtemps que l'on ne fournit pas opérande qui provoque un débordement, ou une division par zéro.
Ce n'est pas le cas avec l'arithmétique en virgule flottante, où certaines parties de valeurs peuvent être perdues lors de l'utilisation de ces valeurs dans des opérations simples. La raison en est que l'énorme portée offerte par les valeurs à virgule flottante est telle qu'il est impossible de représenter toutes les valeurs contiguës dans la plage, étant donné le [relativement] petit stockage (typiquement 8 ou 16 octets).

+1

Pas toujours. Un double de 64 bits a plus de précision qu'un int de 32 bits. –

+0

@Mark Ransom. Quelle que soit la taille de la variable, un entier est toujours, dans sa plage, précis à 100%. Cela ne ressemble pas à une valeur flottante qui, dans sa fourchette, peut inclure des parties qui seront perdues lorsque la valeur est utilisée pour divers calculs, même simples. – mjv

+0

Il est trivialement facile de générer une constante qui représente la plus grande valeur à virgule flottante qui garantit une précision égale à un entier. Le point flottant offre souvent des garanties encore plus grandes. Qu'est-ce que vous obtenez si vous multipliez 2147483647 x 2147483647 comme entiers? En double? –

2

Les entiers sont à compter, les nombres à virgule flottante sont à calculer. Nous les avons tous les deux en maths (où ils sont respectivement appelés entiers et nombres réels) donc nous en avons besoin dans les algorithmes et dans les programmes aussi. Fin de l'histoire. Bien sûr, la portée de la plupart des implémentations de nombre fp est plus grande que celle de la plupart des implémentations entières mais je pourrais inventer un langage dans lequel j'autoriserais des entiers de 512 bits mais seulement des nombres flottants de 16 bits (1 bit de signe , 3 bits d'exposant, 12 significand bits). Les entiers ne sont toujours pas fermés sous division et les nombres à virgule flottante ne servent toujours pas à compter car s'il existe une fonction successeur sur les nombres fp, il n'y a pas de nombres réels et nous aimons prétendre que les nombres fp sont une implémentation proche de nombres réels.

Non, les entiers ne sont pas plus faciles sur le processeur, le processeur effectue des opérations logiques booléennes fondamentales sur les bits. Et si le processeur X1 fait un calcul arithmétique plus rapide que l'arithmétique fp, un trawl à travers les banques de mémoire trouvera un contre-exemple.

Nous n'avons même pas besoin de nombres fp pour les fractions, nous pourrions utiliser des paires d'entiers pour représenter le numérateur et le dénominateur.

La précision absolue des nombres entiers est la raison pour laquelle nous les utilisons pour le comptage. Pour toutes fins pratiques, la précision des implémentations de fp existantes est assez (maintenant, il y a une demande sauvage pour attirer désaccord!)

Cordialement

Mark

+1

Les numéros FP ne sont PAS des nombres réels. S'il vous plaît ne donnez pas OP ou n'importe qui cette idée. Les numéros de PF ne sont pas fermés par division, comme vous l'avez mentionné. Infinity est un nombre à virgule flottante mais ni un réel ni un int. – Potatoswatter

+1

Le point flottant est absolument fermé lors de la division. Lorsque vous divisez deux valeurs à virgule flottante, vous obtenez une autre valeur à virgule flottante. Toujours. Cela peut ne pas être exactement égal au résultat que vous obtiendriez s'ils étaient des nombres réels, mais ce n'est pas ce que * closed * signifie. La division des valeurs à virgule flottante est * définie * pour inclure cet arrondi. –

+0

Oh, je pense que nous avons un problème de terminologie subtile ici. Potatoswatter a dit "numéro de FP", et Stephen a dit "valeur en virgule flottante". Qu'en est-il de NaN? C'est une valeur qu'une variable à virgule flottante peut contenir, mais de son propre aveu, ce n'est pas un nombre. Les nombres à virgule flottante * ne sont pas fermés lors de la division, mais les * valeurs * des variables à virgule flottante sont fermées en division, n'est-ce pas? – Ken

0

Entiers sont les choses les plus courantes à utiliser dans les tâches de programmation. Ils peuvent représenter des adresses de mémoire. Il est facile de compter d'un entier à l'autre: il suffit d'en ajouter un.

Les valeurs à virgule flottante sont utilisées pour approximer les nombres réels. Les nombres réels sont le type le plus commun de chose en mathématiques continues. Les mathématiques continues sont utilisées pour représenter le monde réel. (D'où la terminologie "nombre réel".)

Les valeurs à virgule flottante ne peuvent généralement pas être utilisées comme nombres entiers. Vous ne pouvez pas facilement compter de X au nombre suivant supérieur à X. Ils arrondissent, et il n'y a aucune garantie que X + 1 est même un nombre différent de X. De manière générale, deux nombres à virgule flottante peuvent être différents s'ils ont été produites par différentes séquences d'opérations, même si les expressions sont censées être égales.

Les nombres à virgule flottante sont imprévisibles, comme la vraie vie. Les entiers sont ordonnés et efficaces, comme les ordinateurs.

+0

Les nombres à virgule flottante sont complètement prévisibles. Ce n'est pas comme si votre ordinateur renvoyait un nombre aléatoire lorsque vous le demandiez aux annonces 1e-32 à 1e + 32. Ce n'est simplement pas simple, et certainement pas intuitif pour l'utilisateur occasionnel. Vous devez étudier la norme de mise en œuvre pertinente et être prêt à élaborer les détails sur papier si nécessaire. –

+0

Certains aspects de la vie réelle sont également prévisibles, et deviennent plus prévisibles avec plus d'analyse. C'est une analogie. – Potatoswatter

0

Dans la plupart des applications, les nombres à virgule flottante peuvent être remplacés par des nombres entiers, en définissant avec précision la plage de valeurs à représenter avec précision et en multipliant par des facteurs d'échelle appropriés. Cependant, ceci est un effort de développement supplémentaire, qui ne vaut que sur les petites plates-formes intégrées (c'est-à-dire les petits microcontrôleurs) qui ne peuvent pas effectuer les calculs en arithmétique à virgule flottante dans le temps disponible. Avec les nombres à virgule flottante, vous pouvez vous absenter sans penser à la représentation des valeurs la plupart du temps, tant que vous restez dans la plage disponible et la précision. Malheureusement, c'est plutôt dangereux, parce que vous ne remarquerez peut-être pas cela lorsque vous quitterez la région sûre.

0

Perspective légèrement différente: Les entiers sont utiles pour les grandeurs numériques, tandis que les flottants sont utiles pour les grandeurs analogiques. Un exemple, en regardant les bateaux dans le port, utilise des ints pour compter les bateaux, utilise des flotteurs pour représenter le niveau de l'eau.