matlab число в строку

Предположим, что я хочу преобразовать число 0.011124325465476454 в строку в MATLAB.

Я получаю 0.011124325465476453 , который отличается в последней цифре.

Если я ударил num2str(0.011124325465476454,’%5.25f’)

Я получаю 0.0111243254654764530000000

который дополняется нежелательными нулями и отличается в последней цифре (3 должно быть 4).

Мне нужен способ преобразования чисел со случайным числом десятичных знаков в их соответствие точной строке (без нулей, без окончательной модификации цифр).

EDIT: Поскольку я не имею в виду информацию о точности, которую предоставили Amro и nrz, я добавляю дополнительную дополнительную информацию о проблеме. Цифры, которые мне действительно нужно преобразовать, поступают из программы на С++, которая выводит их в txt файл, и все они являются типами С++ ****** . [ПРИМЕЧАНИЕ. Часть, которая вводит числа из файла txt в MATLAB, не кодируется мной, и мне на самом деле не разрешено изменять ее, чтобы сохранить числа в виде строк без преобразования их в числовые значения. У меня есть доступ к этому «выходному» коду, который представляет собой число, которое я хотел бы преобразовать]. До сих пор я не получил числа с более чем 17 десятичными знаками (ПРИМЕЧАНИЕ: следовательно, приведенный выше пример с восемью десятичными знаками не очень показателен).

Теперь, если число содержит 15 цифр, например 0.280783055069002

затем num2str(0.280783055069002,’%5.17f’) или mat2str(0.280783055069002,17) возвращает

который не является точным числом (см. последние цифры).

Но если я ударил mat2str(0.280783055069002,15) , я получаю

0.280783055069002 , что является правильным.

Возможно, существует миллион способов «кодировать» проблему (например, создать процедуру, которая выполняет преобразование), но не существует способа использования стандартного встроенного MATLAB для получения желаемых результатов при вводе числа с случайное число десятичных знаков (но не более 17);

My HPF toolbox также позволяет работать с произвольной точностью чисел в MATLAB.

В MATLAB попробуйте следующее:

Как вы можете видеть, MATLAB записывает его с цифрами, которые вы поставили. Но как MATLAB действительно «чувствует» это число? Что он хранит внутри страны? Посмотрите, что говорит sprintf:

И это то, что видит HPF, когда пытается извлечь это число из ******:

Дело в том, что почти все десятичные числа НЕ представляются точно в арифметике с плавающей запятой как двойной. (0,5 или 0,375 являются исключениями из этого правила по очевидным причинам.)

Однако при сохранении в десятичной форме с 18 цифрами мы видим, что HPF не нужно было записывать число как двоичное приближение к десятичной форме.

Ничто не понимает, что десятичные числа не сохраняются в десятичной форме как двойные. Например, как выглядит 0.1 внутри себя?

Как вы видите, Matlab не сохраняет его как 0,1. Фактически, Matlab хранит 0,1 в виде двоичного числа, здесь фактически.

или если вы предпочитаете

Чтобы точно представлять 0,1, это потребовало бы бесконечного числа таких терминов, поскольку 0,1 является повторяющимся числом в двоичном виде. MATLAB останавливается на 52 бит. Точно так же, как 2/3 = 0,6666666666. в виде десятичной дроби, 0,1 хранится только как приближение как двойное.

Вот почему ваша проблема действительно полностью связана с точностью и бинарной формой, которую содержит двойной.

Как окончательное редактирование после чата.

Дело в том, что MATLAB использует ****** для представления числа. Таким образом, он будет принимать число с до десяти десятичными цифрами и сможет вытолкнуть их с правильной настройкой формата.

И мы видим, что MATLAB справился с этим. Но теперь добавьте еще одну цифру в конец.

В своей полной славе посмотрите на x, как видит MATLAB:

Поэтому всегда будьте осторожны с последней цифрой любого числа с плавающей запятой. MATLAB будет пытаться объединить все разумно, но 15 цифр находятся на краю того, где вы в безопасности.

Нужно ли использовать такой инструмент, как HPF или MP, для решения такой проблемы? Нет, если вы признаете ограничения двойника. Однако инструменты, которые предлагают произвольную точность, дают вам возможность быть более гибкими, когда вам это нужно. Например, HPF предлагает использовать и контролировать контрольные цифры в этой области подвала. Если они вам нужны, они там, чтобы сохранить цифры, которые вам нужны, от коррупции.

В.Г.Потемкин «Введение в Matlab» (v 5.3)
Индексные указатели

Основные функции

blanks Сформировать строку пробелов
cellstr Преобразовать массив символов в массив ячеек для строк
char Сформировать массив символов
deblank Удалить пробелы в конце строки
double Преобразовать символы строки в числовые коды

Проверка строк

ischar Истинно, если это массив символов (строка)
iscellstr Истинно, если это массив ячеек для строк
isletter Истинно, если это символ алфавита
isspace Истинно, если это пробел

Операции над строками

strcat Горизонтальное объединение строк
strvcat Вертикальное объединение строк
strcmp Сравнить строки
strncmp Сравнить n символов строк
findstr Найти заданную строку в составе другой строки
strjust Выравнять массив символов
strmatch Найти все совпадения
strrep Заменить одну строку другой
strtok Найти часть строки, ограниченную разделителями
upper Перевести все символы строки в верхний регистр
lower Перевести все символы строки в нижний регистр

Преобразования строк

num2str Преобразование числа в строку
int2str Преобразование целого в строку
mat2str Преобразование матрицы в строку
str2mat Объединение строк в матрицу
str2num Преобразование строки в арифметическое выражение и его вычисление
sprintf Записать форматированные данные в виде строки
sscanf Прочитать строку с учетом формата

Преобразования систем счисления

1 bigTree [2013-10-15 16:54:00]

Я пытаюсь написать матрицу в текстовый файл. Первым элементом моей матрицы является число (идентификатор объекта), которое имеет несколько цифр. Первая цифра может быть равна нулю (например, 023512, 146498 и т.д.).

Чтобы записать файл, у меня есть цикл:

В этом примере я получаю файл

23512, l 23534, l 112512, l 63512, l 223512, l

Я попытался использовать% d в fSpec [‘% d’ ‘% s’ ‘% s’ ‘
], но в этом случае я получаю предупреждение: вне диапазона или нецелые значения, усеченные во время преобразования в символ, Нуль все еще удаляется, и все записывается в одну строку.

Есть ли способ конвертировать число в строку без усечения нуля?

Оцените статью
SoftLast
Добавить комментарий