2014-01-15 4 views
9

Мой эксперимент показывает, связанное 24, что достигается за счет -Double.MIN_NORMAL, что приводит кКакова максимальная длина Double.toString (d)?

-2.2250738585072014E-308 

... но я не могу доказать это, ни придумать убедительное причина, почему никакое другое значение не должно бить -MIN_NORMAL.

+0

Длина как в количестве символов? Что вызвало любопытство по этому поводу? –

+0

Вы можете попробовать Windows, MacOSX (другой процессор), Linux на разных платформах. Это делается для Oracle java в 'sun.misc.FloatingDecimal.toJavaFormatString (d)', поэтому нет никакой гарантии. За исключением 8 байтов удваивается, можно разумно аппроксимировать ограниченным числом десятичных знаков. –

+0

@JoopEggen: Javadoc из 'Double.toString' подразумевает детерминированный алгоритм, который должен быть независимым от платформы. –

ответ

4

Это 64-битный IEEE-754 с плавающей точкой.

Самые десятичные числа, которые могут быть сохранены в 52-битной мантиссе, составляют 17 (см. page 4: ceil(1 + N Log10(2))), так что это 19 символов с десятичной точкой и отрицательным знаком.

Предвзятость составляет 1023, поэтому наименьший показатель уровня-222 составляет 2^-1022, что составляет около 10^-308, поэтому самый длинный показатель составляет 5 символов с «E» и отрицательным знаком.

19 + 5 == 24

+0

Есть ли у вас ссылка на« Самые десятичные числа, которые могут быть сохранены в 52-битной мантиссе, составляет 17 »? –

+0

@LouisWasserman - это было бы легко подтвердить, преобразовывая 52-битное двоичное число всех 1s в десятичное. –

+0

Что вы можете сделать, например, калькулятор Windows, глядя на цифры 13 "F" в шестнадцатеричном формате, а затем преобразовывая их в десятичные. –

0

Я думаю, что эта оценка верна. javadoc говорит

Сколько цифр должны быть напечатаны для дробной части m или a? Должна быть хотя бы одна цифра, чтобы представлять дробную часть, а за ее пределами - столько, сколько нужно, но больше, чем столько цифр, сколько необходимо для однозначного отличия значения аргумента от смежных значений типа double.

A double имеет подразумеваемую целую часть (1) и бит 52 мантиссы. Таким образом, если показатель основания-2, представленный double, равен 0, так что x является double в диапазоне [1,2), то следующий более высокий соседний double равен + 2 -52. 2 -52 есть примерно 2.2204 * 10 -16. Это говорит о том, что количество дробных цифр, необходимых для отличия значения от следующего соседнего значения, равно 16, то есть двойное смежное с 1 будет представлено как 1.0000000000000002 (15 нулей). Поскольку это соответствует количеству дробных цифр в вашем эксперименте, кажется очень вероятным, что это действительно максимальное число, которое когда-либо понадобится. Конечно, это не строгое доказательство; это займет немного больше работы.

1

26, по-видимому, является верхней границей, например, следующим образом.

По версии GrepCode о FloatingDecimal.getChars, OpenJDK7 asserts, что значение nDigits составляет не более 19. Глядя на код, nDigits появляется для обозначения цифр (а не десятичной точки) мантиссы: в приведенном выше примере, 22250738585072014 , Дополнительные символы, а затем, включают в себя

  • - знак на значении в целом
  • точки . десятичного
  • E для показателя
  • - знак на показателе
  • в наиболее три десятичных знака на уровне экспонента

... который производит 7 + 19 = 26.

(Аргументы за более жесткие пределы по-прежнему приветствуются.)

Смежные вопросы