2010-10-21 6 views
2

Lorsque vous utilisez fprintf pour convertir des flottants en texte dans une représentation décimale, la sortie est une série de chiffres décimaux (commençant éventuellement par 0).
Comment fonctionne cette représentation?Comportement flottant du texte de fprintf de MATLAB()

>>fprintf('%tu\n',pi) 
>>1078530011 
>>fprintf('%bu\n',pi) 
>>04614256656552045848 

Excuses si cela est très trivial; Je ne trouve pas de réponse ailleurs, en partie parce que les recherches sont submergées par les différents types de données décimaux disponibles. Notez que les indicateurs% t et% b sont deux des différences par rapport à fprintf() de C. Selon la documentation, il imprime un float ou un double respectivement "plutôt qu'un entier non signé". o, x et u bascule entre octal, hex et décimal.

+1

FPRINTF/SPRINTF ont la même syntaxe que les fonctions de C. Vous devez quand même toujours vérifier les documents MATLAB: http://www.mathworks.com/help/techdoc/ref/fprintf.html – Amro

+1

Les docs disent% t et % b sont deux différences par rapport à C. –

+1

N'y a-t-il pas de signes de pourcentage manquants (c'est-à-dire ne devrait-il pas être '% tu \ n'' au lieu de' 'tu \ n'')? –

Répondre

2

Cette représentation est le binaire IEEE 754 floating point representation du nombre, imprimé en tant qu'entier non signé. Le site Web IEEE 754 Converter indique que la représentation IEEE 754 à simple précision de Pi (environ 3,1415927) est 40490FDB hexadécimal, soit 1078530011 décimal (le nombre que vous avez vu imprimé). Le spécificateur de format '%bu' fonctionne de manière similaire, mais génère la représentation à double précision.

Le but de ces spécificateurs de format est de vous permettre de stocker une représentation légèrement exacte d'une valeur à virgule flottante dans un fichier texte. L'approche alternative de l'impression de la valeur à virgule flottante sous une forme lisible par l'homme nécessite beaucoup de soin si vous voulez garantir un stockage à peu près exact, et il peut y avoir des cas limites (valeurs dénormalisées ...?) Que vous n'aurez pas être capable de stocker précisément du tout.

1

Si vous deviez imprimer le numéro comme hexadécimaux:

>> fprintf('%bx\n', pi) 
    400921fb54442d18 

>> fprintf('%tx\n', single(pi)) 
    40490fdb 

alors les formatteurs '%bx' et '%tx' sont tout simplement équivalent à l'utilisation NUM2HEX:

>> num2hex(pi) 
    400921fb54442d18 

>> num2hex(single(pi)) 
    40490fdb 

Une autre façon est de simplement régler la sortie par défaut format en hexadécimaux en utilisant:

>> format hex 
>> pi 
    400921fb54442d18 
>> single(pi) 
    40490fdb 

Sur une note connexe, il y avait un article récent par @ Loren: "How Many Digits to Write?" où ils essaient de trouver combien de chiffres décimaux vous avez besoin d'écrire afin de conserver la précision complète du nombre lorsqu'il est relu dans MATLAB.

Questions connexes