Предположим, что я хочу преобразовать число 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’ ‘
], но в этом случае я получаю предупреждение: вне диапазона или нецелые значения, усеченные во время преобразования в символ, Нуль все еще удаляется, и все записывается в одну строку.
Есть ли способ конвертировать число в строку без усечения нуля?