Поведение текста с плавающей точкой в ​​MATLAB's fprintf () - PullRequest
2 голосов
/ 21 октября 2010

При использовании fprintf для преобразования чисел с плавающей запятой в текст в десятичном представлении выходные данные представляют собой последовательность десятичных цифр (потенциально начиная с 0). Как работает это представление?

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

Извинения, если это очень тривиально; Я не могу найти ответ в другом месте, отчасти потому, что поиски забиты различными доступными типами десятичных данных.

Обратите внимание, что флаги% t и% b являются двумя отличиями от C fprintf(). Согласно документации, он печатает число с плавающей запятой или двойное число соответственно, а не целое число без знака. o, x и u переключаются между восьмеричным, шестнадцатеричным и десятичным.

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Это двоичное представление IEEE 754 с плавающей запятой числа, напечатанное в виде целого числа без знака.

Веб-сайт IEEE 754 Converter сообщает, чтоПредставление Pi в IEEE 754 с одинарной точностью (приблизительно 3,1415927) имеет шестнадцатеричное значение 40490FDB, то есть десятичное 1078530011 (число, которое вы видели напечатанным).Спецификатор формата '%bu' работает аналогичным образом, но выводит представление с двойной точностью.

Цель этих спецификаторов формата - позволить вам сохранить точное битовое представление значения с плавающей запятой в текстовом файле.Альтернативный подход печати значения с плавающей запятой в удобочитаемой форме требует большой осторожности, если вы хотите гарантировать точное хранение битов, и могут быть некоторые крайние случаи (денормализованные значения ...?), Которые вы не будетеуметь хранить точно на всех.

1 голос
/ 21 октября 2010

Если вы должны были напечатать число в шестнадцатеричном формате:

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

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

тогда форматеры '%bx' и '%tx' просто эквивалентны использованию NUM2HEX:

>> num2hex( pi )
    400921fb54442d18

>> num2hex( single(pi) )
    40490fdb

Другой способ - просто установить формат вывода по умолчанию на шестнадцатеричные числа, используя:

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

В связанной заметке недавно появилась статья @Loren: " Сколько цифр написать? " где они пытаются найти, сколько десятичных цифр нужно написать, чтобы сохранить полную точность числа при повторном чтении в MATLAB.

...