Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.02.2011, 05:39
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Как получить максимальное и минимальное допустимое число в не экспоненциальном виде?
Сабж.
Ответить с цитированием
  #2 (permalink)  
Старый 21.02.2011, 09:37
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Number.prototype.toDigits = function() {
     var str = this.toString(), tmp = '', i, d,
     x = str.match(/^(\d+)\.(\d+)[eE]([-+]?)(\d+)$/);
     if(x) {
         d = x[2];
         i = (x[3] == '-') ? x[4]-1 : x[4]-d.length;
         while(i--) {
             tmp += '0';
         }
         if(x[3] == '-') {
             return '0.'+tmp+x[1]+d;
         }
         return x[1]+d+tmp;
     }
     return str;
 };
 
alert(Math.max(Math.pow(2147483648, 2), Math.pow(2147483648, 3)).toDigits());

Последний раз редактировалось monolithed, 21.02.2011 в 09:43.
Ответить с цитированием
  #3 (permalink)  
Старый 23.02.2011, 04:53
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Спасибо, но я ничего не понял
Регулярки, тернарные операции... А уж тем более то, что вы привели вконце: зачем мне строка с цифрами, полученная в результате возведения в степень, если мне просто нужно самое большое число типа Number в "точном" виде. А для чисел бОльших, чем сабж можно использовать bigInt.
Ответить с цитированием
  #4 (permalink)  
Старый 23.02.2011, 10:57
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от FINoM
но я ничего не понял
продолжайте учить язык, что тут сказать
Сообщение от FINoM
А уж тем более то, что вы привели вконце: зачем мне строка с цифрами, полученная в результате возведения в степень
можете убрать возведение в степень, зачем это сделано объяснять не буду
Сообщение от FINoM
если мне просто нужно самое большое число типа Number в "точном" виде
так оно и есть!
Сообщение от FINoM
А для чисел бОльших, чем сабж можно использовать bigInt.
в ES нет такого типа данных
Ответить с цитированием
  #5 (permalink)  
Старый 23.02.2011, 13:19
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от monolithed
так оно и есть!
Угу http://my.jetscreenshot.com/demo/20110223-gqhe-50kb.jpg
Сообщение от monolithed
в ES нет такого типа данных
Пардон, библиотеку bigInt.
Ответить с цитированием
  #6 (permalink)  
Старый 23.02.2011, 13:27
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от FINoM
Угу http://my.jetscreenshot.com/demo/20110223-gqhe-50kb.jpg
это сарказм?
Number.prototype.toDigits = function() {
     var str = this.toString(), tmp = '', i, d,
     x = str.match(/^(\d+)\.(\d+)[eE]([-+]?)(\d+)$/);
     if(x) {
         d = x[2];
         i = (x[3] == '-') ? x[4]-1 : x[4]-d.length;
         while(i--) {
             tmp += '0';
         }
         if(x[3] == '-') {
             return '0.'+tmp+x[1]+d;
         }
         return x[1]+d+tmp;
     }
     return str;
};
 

function intSize() {
    var arg = arguments, i = arg.length, array = [];
    while(i--) {
        array.push(arg[i]);
    }
     alert('Min: '+Math.min.apply(null, array).toDigits()+ '\nMax: '+Math.max.apply(null, array).toDigits())
};

intSize(1147483648000000000000000, 2147483648000000000000000, 3147483648000000000000000);

Последний раз редактировалось monolithed, 23.02.2011 в 19:40.
Ответить с цитированием
  #7 (permalink)  
Старый 23.02.2011, 15:19
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Вообще-то, зная формат представления вещественных чисел в памяти, можно получить максимальное и минимальное значения типа Number без привлечения Javascript-программы.
Например, мы знаем, что в памяти под число вещественного типа комп отводит 8 байт, из которых 52 бита занимает мантисса, 11 бит — экспонента и один знаковый бит. В этом случае максимальное значение вещественного числа в двоичной нотации должно выглядеть так:

01111111 11101111 11111111 11111111 11111111 11111111 11111111 11111111

Последний, старший разряд (выделен голубым) равен 0, т.е. число положительное. 11 бит экспоненты выделены красным, а мантисса — зеленым. Взять все единицы в экспоненте нельзя, т.к. такое значение экспоненты зарезервировано под значения Infinity или NaN. Поэтому младший разряд оставлен нулевым. Чтобы получить истинное значение мантиссы, к ней нужно добавить единицу с разделительной точкой, т.е. в этом примере мантисса реально равна числу в двоичной записи

1.1111 11111111 11111111 11111111 11111111 11111111 11111111

В десятичной записи это число практически равно двойке, а точнее можно вычислить при помощи формулы для суммы n=52 членов геометрической прогрессии со знаменателем 0.5. Наше двоичное число в переводе в десятичную систему равно

1 + 1/2 + 1/4 + 1/8 + 1/16 + ... + 1/2^52 = 1 + 0.5 · (0.5^52 - 1)/(0.5 - 1) = 1.99999999999999977795539507496869...

Мантиссу нашли, теперь ее надо умножить на экспоненту. При расчете экспоненты за ноль принимается число 1023. Наша экспонента в двоичной записи равна 11111111110, что в десятичной эквивалентно числу 2046. Поскольку за ноль принято 1023, то реально экспонента равна 2046-1023=1023. Тогда значение, на которое нужно умножить мантиссу равно 2^1023 = 8.9884656743115795386465259539451e+307. В результате максимальное допустимое типом Number число равно

1.99999999999999977795539507496869 · 8.9884656743115795386465259539451e+307 = 1.7976931348623157081452742373164e+308

Далее в спецификации или опытным путем находим, какое максимально возможное количество значащих цифр поддерживает язык при выводе на экран. Пусть это будет 21. Соответственно урезаем найденное максимально возможное число до 22-23 значащих цифр, дописываем в конец оставшиеся нолики и говорим, что получена запись максимального значения с максимально допустимой языком точностью.

17976931348623157081450000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 000000000

Поправьте, если ошибся.
Ответить с цитированием
  #8 (permalink)  
Старый 23.02.2011, 17:49
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Amphiluke, если не ошиблись с количеством нулей, то похоже на правду. Во всяком случае первые значащие цифры совпадают с тем, что выводит браузер в экспоненциальной записи
alert( Number.MAX_VALUE )
Ответить с цитированием
  #9 (permalink)  
Старый 23.02.2011, 19:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Забавно всё это)
alert([
Number.MAX_VALUE/(1e293),
Number.MAX_VALUE/(1e292),
Number.MAX_VALUE/(1e291),
Number.MAX_VALUE/(1e290),
Number.MAX_VALUE/(1e289),
Number.MAX_VALUE/(1e288),
Number.MAX_VALUE/(1e287)
].join('\n'))
Ответить с цитированием
  #10 (permalink)  
Старый 23.02.2011, 20:24
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Aetae, это тоже можно объяснить, исходя из понятия т.н. «машинного эпсилон».

Размер мантиссы для вещественных чисел в Javascript составляет 52 бита. Поэтому наименьшее число, представляющее разницу между двумя возможными значениями мантиссы равно (в двоичной системе)

0.000000000000000000000000000000000000000000000000 0001,

или 2^(-52) = 2.22e-16. То есть как минимум в 17-м знаке после запятой (в десятичной системе счисления) будут наблюдаться погрешности округления. Видимо, для вашего примера, причина в этом.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список элементов в localStorage? Бобр Общие вопросы Javascript 8 17.09.2013 14:32
Как получить название композиции из Windows Mepia Plyaer alx99 Javascript под браузер 1 18.02.2011 16:21
Разбить число на миссив, как ? Bogdan808 Общие вопросы Javascript 20 01.09.2010 18:19
Как получить указатель на элемент вызвавший функцию pelayo Общие вопросы Javascript 9 29.06.2010 23:32
Как округлить число в меньшую сторону с заданной точностью? barcelona Общие вопросы Javascript 2 19.08.2009 12:07