Почему требуемая длина результирующей строки для sprintf ("%. 8190f", .Machine $ double.xmax) или sprintf ("%. 8190f", (2-2 ^ (- 52)) * 2 ^ 1023) равна 8500 ? - PullRequest
1 голос
/ 23 мая 2019

В нормированном представлении двойной точности, думая «1». «1.f» в дробной части приводит к уменьшению максимального значения sprintf с 8192 до 8190.

Теперь;

identical(.Machine$double.xmax, (2-2^(-52))*2^1023) # TRUE

sprintf("%.8190f", .Machine$double.xmax)
# Error in sprintf("%.8190f", .Machine$double.xmax) : required resulting string length 8500 is greater than maximal 8192

sprintf("%.8190f", (2-2^(-52))*2^1023)
# Error in sprintf("%.8190f", (2 - 2^(-52)) * 2^1023) : required resulting string length 8500 is greater than maximal 8192

sprintf("%.8190f", .Machine$double.xmax- 10^308)
# Error in sprintf("%.8190f", .Machine$double.xmax - 10^308) : required resulting string length 8499 is greater than maximal 8192

sprintf("%.7882f", -.Machine$double.xmax) 
# Error in sprintf("%.7882f", -.Machine$double.xmax) : required resulting string length 8193 is greater than maximal 8192
sprintf("%.7881f", -.Machine$double.xmax) # Seamlessly shows the result.

(2-2 ^ (- 52)) 2 ^ 1023 ≈ 1797693 x 10 ^ 308. Итак, где же это 8500 в sprintf выход материализуется из?

Кроме того, значение sprintf равно: Символьный вектор длины, который соответствует длине самого длинного ввода. Если какой-либо элемент fmt или любой символьный аргумент объявлен как UTF-8, элемент результата будет в UTF-8 и будет иметь кодировку, объявленную как UTF-8. В противном случае он будет в кодировке текущей локали.

Итак, sprintf кажется не , чтобы дать 64-битное представление с плавающей запятой двойного приоритета для числового значения?

1 Ответ

3 голосов
/ 23 мая 2019

Формат ”%. n f” при необходимости создает отрицательный знак, целые десятичные цифры печатаемого числа, точку и столько десятичных цифр, сколько указано в п .Таким образом, для наибольшего представимого конечного значения около 1.797693 • 10 308 , %.8190f даст 309 цифр, одну десятичную точку и 8 190 нулей после десятичной точки, что составляет в общей сложности 8500 символов.

В качестве подтверждения обратите внимание, что результат nchar(sprintf("%.100f", .Machine$double.xmax)) равен 410 для 309 цифр, одной десятичной точки и 100 нулей после десятичной точки.

...