first:
похоже, что sprintf и fprintf ведут себя по-разному в разных версиях MATLAB, например, в MATLAB 2018 a
num=2.7182818284590666666666;
sprintf('%0.70f', num)
ans =
'2.7182818284590668511668809514958411455154418945312500000000000000000000'
second:
Числа с плавающей точкой
MATLAB® представляет числа с плавающей точкой в формате с двойной или одинарной точностью.По умолчанию используется двойная точность, но вы можете сделать любую точность одинарной точности с простой функцией преобразования.
Двойная точность с плавающей точкой
MATLAB создает тип данных двойной точности (или двойной) в соответствии спо стандарту IEEE® 754 для двойной точности.Любое значение, хранящееся как двойное число, требует 64 бита, отформатированного, как показано в таблице ниже:
Биты: 63
Использование: Знак (0 = положительный, 1 = отрицательный)
Биты:62 до 52 Использование: экспонента, смещение 1023
Биты: от 51 до 0 Использование: Фракция f числа 1.f
см. Эту ссылку для получения дополнительной информации
Между 252 = 4,503,599,627,370,496 и 253 = 9,007,199,254,740,992 представимые числа являются в точности целыми числами.Для следующего диапазона, от 253 до 254, все умножается на 2, поэтому представимые числа являются четными и т. Д. И наоборот, для предыдущего диапазона от 2 ^ 51 до 2 ^ 52 интервал равен 0,5 и т. Д.
Интервал как часть чисел в диапазоне от 2 ^ n до 2 ^ n + 1 составляет 2 ^ n − 52.Таким образом, максимальная относительная ошибка округления при округлении числа до ближайшего представимого числа (эпсилон машины) составляет 2 ^ −53.
, поэтому в вашем случае, когда n = 1 (2 ^ 1 <= num<= 2 ^ 2) интервал равен 2 ^ -51, </p>
Я думаю, можно с уверенностью предположить, что алгоритмы sprintf и sprintf для отображения чисел хитры, а тип MATLAB Double основан на стандарте IEEE,
о VPA:
vpa Использует защитные цифры для поддержания точности
Значение функции цифр определяет минимальное количество используемых значащих цифр.Внутри vpa может использовать больше цифр, чем указано.Эти дополнительные цифры называются защитными цифрами, поскольку они защищают от ошибок округления в последующих вычислениях.
Численно приблизительно 1/3 с использованием четырех значащих цифр.
a = vpa(1/3, 4)
a =
0.3333
Приблизительный результатс использованием 20 цифр.Результат показывает, что при наборе a инструментарий внутренне использовал более четырех цифр.Последние цифры в результате неверны из-за ошибки округления.
vpa(a, 20)
ans =
0.33333333333303016843
проблема, с которой вы можете столкнуться из-за пробелов, алгоритма цифр gaurd и проблемы округления,
например, используя matlab 2018 a:
sprintf('%0.28f', 8.0)
ans =
'8.0000000000000000000000000000'
, но:
sprintf('%0.28f', 8.1)
ans =
'8.0999999999999996447286321199'
, поскольку число находится в диапазоне от 2 ^ 3 до 2 ^ 4, поэтому интервал составляет 2 ^ -49 (= 1,77 е-15), поэтому число действует до 15-го знака после запятой и
sprintf('%0.28f', 64.1)
ans =
'64.0999999999999943156581139192'
, поскольку число находится в диапазоне от 2 ^ 6 до 2 ^ 7, поэтому расстояние составляет 2 ^ -46 (= 1,42 е14) поэтому номер действителен до 14 знака после запятой