Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> диапазон целых чисел в double без потери точности 
V
    Опции темы
leniviy
Дата 25.9.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Подскажите непрерывный диапазон целых чисел, которые можно хранить в переменной типа double без потери точности.
Это точно не DBL_MIN..DBL_MAX
Код

#include <stdio.h>
#include <float.h>
int main() {
  double d1 = DBL_MAX;
  double d2 = d1 - 1;
  printf("%d\n", d1 == d2);
  return 0;
}

Код

1

PM MAIL   Вверх
Alexeis
Дата 25.9.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



-/+ 4 503 599 627 370 496

__int64 может больше.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
tzirechnoy
Дата 26.9.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Да, примерно +-2^[число бит мантиссы-1], кстати. На будущее.
PM MAIL   Вверх
Alexeis
Дата 26.9.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



 А почему -1 ? В числах с плавающей точкой знак хранится отдельно. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
math64
Дата 27.9.2012, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Код

double f = 1;
int n = 0;
for(;;) {
  n++;
  f = f * 2;
  double f1 = f + 1;
  double f2 = f + 2;
  if (f == f1 || f1 == f2) break;
}
printf ("%d %17g\n", n, f);

Мантисса позволяет хранить целые от 0 до 2^n-1, но за счёт экспоненты double может хранить и 2^n. За счёт того, что знак хранится отдельно, диапазон симметричен -2^n ... 2^n

Это сообщение отредактировал(а) math64 - 27.9.2012, 08:32
PM   Вверх
tzirechnoy
Дата 27.9.2012, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
 А почему -1 ? В числах с плавающей точкой знак хранится отдельно. 


Ну, по факту -- если там один бит, то только 0, +1, -1. 2 ужэ от 3 не отличить. То есть +-2^0.

PS Да, я в биты включал и неявный, если он есть. В IEEE 754 double -- есть (малые числа не рассматриваем за нерелевантностью), т.е. 53 бита мантиссы записываются в 52 бита в памяти.

PM MAIL   Вверх
Alexeis
Дата 28.9.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(tzirechnoy @  27.9.2012,  19:32 Найти цитируемый пост)
Ну, по факту -- если там один бит, то только 0, +1, -1. 2 ужэ от 3 не отличить. То есть +-2^0.

  Все равно не верно. Тогда можно сказать лишь, что (2^n) - 1, а не 2^(n-1)

  Возьмем число в основном коде состоящее из 3х бит 111 (бинарная система) = 7 (десятичная)
2^(3-1) = 4
(2^3) - 1 = 7




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
math64
Дата 28.9.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(Alexeis @  28.9.2012,  10:05 Найти цитируемый пост)
 Все равно не верно. Тогда можно сказать лишь, что (2^n) - 1, а не 2^(n-1)

  Возьмем число в основном коде состоящее из 3х бит 111 (бинарная система) = 7 (десятичная)
2^(3-1) = 4
(2^3) - 1 = 7

8 тоже записывается в виде 100(2)*10(2)^1
А 9 уже нет, при выолнении 8+1 можно получить 8 или 10 (в зависимости от правил округления)
Поэтому при 3 битах мантиссы (1 из них может быть скрытым) диапазон будет -8...8, т. е. -2^n...2^n без всяких -1

PM   Вверх
tzirechnoy
Дата 28.9.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
 Возьмем число в основном коде состоящее из 3х бит 111 (бинарная система) = 7 (десятичная)
2^(3-1) = 4
(2^3) - 1 = 7


(хар)0xy == (хар-1)xy0. Так что выкидываем как дубли 001, 010, 011 (000 -- симметричен и не дублируется). То есть остаётся +-4. Доказывать -- лень (оставляю это для самостоятельной тренировки smile)

Добавлено через 1 минуту и 36 секунд
А можэт, и не выкидываем. Чёрт, думать надо. Но по-моему выкидываем. Вечером подумаю.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.