2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 Тип double в C++
Сообщение07.06.2018, 16:50 


06/04/18

323
Цитата:
Тип double содержит 64 разряда: 1 для знака, 11 для экспоненты и 52 для мантиссы. Он имеет диапазон +/–1,7E308 с точностью не менее 15 знаков.
Цитата:
На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от $4,94 \cdot 10^{-324}$ до $1.79\cdot 10^{308}$ (от $2^{-52} \times 2^{-1022}$ до ~$1 \times 2^{1024}$).
Эти два текста дают два разных диапазона. Какой из них правильный?

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 16:54 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Было бы весьма неплохо вместе с цитатами привести их источники.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 16:58 


06/04/18

323
https://msdn.microsoft.com/ru-ru/library/e02ya398.aspx
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D0%BE%D0%B9

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:00 
Аватара пользователя


26/09/16
198
Снегири
Очевидно, первый источник и второй источник.

Верить стоит первому. Второму тоже, но надо посмотреть в правильное место.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:00 


10/04/12
704
Почему разные? Надо учитывать, что диапазон задают четыре числа. Во-первых, это минимальное значение $-1.7 \cdot 10^{308}$, во-вторых это максимальное значение $+1.7 \cdot 10^{308}$. Далее идёт наименьшее строго положительное значение $4.94 \cdot 10^{-324}$, ну и для полноты картины наименьшее строго отрицательное число $-4.94 \cdot 10^{-324}$.

Первая цитата даёт первые два значения. Вторая цитата даёт первое и третье значение.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:02 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
А если бы ишшо упаковать цитаты и их источники вместе, стало бы вааще красиво. Qlin, не отлынивайте. Ну всё равно ж придёт модератор и заставит вас это сделать ;-)

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:14 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Qlin в сообщении #1317922 писал(а):
Эти два текста дают два разных диапазона.

Оба правильные. Гуглите "нормализованное число с плавающей запятой (точкой)" и "денормализованное число с плавающей запятой (точкой)". Числа с порядками меньше $-308$ доступны в денормализованном виде, и соответственно, с меньшей точностью.

А вообще, C++ тут ни при чём. Все современные вычисления с плавающей запятой на всех платформах следуют стандарту IEEE 754.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:19 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Munin в сообщении #1317934 писал(а):
А вообще, C++ тут ни при чём.
Обсуждение изначально пошло по кривой дорожке. Первая цитата — из документации по MS VS (и почему-то даже какой-то старой версии), вторая — из Вики, т. е., по сути, по более общей теме. Строго говоря, их нельзя сравнивать.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:46 
Заслуженный участник
Аватара пользователя


30/01/06
72407
А если говорить про C++, то очевидно, следует пользоваться константами из заголовка <limits>:
    std::numeric_limits<double>::denorm_min()
    std::numeric_limits<double>::min()
    std::numeric_limits<double>::max()
    std::numeric_limits<double>::digits10
    std::numeric_limits<double>::min_exponent10
    std::numeric_limits<double>::max_exponent10
    std::numeric_limits<double>::is_iec559

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 17:55 


06/04/18

323
Что насчет способа вычисления границ этих диапазонов? Я понимаю, почему верхняя граница равна ~$1 \times 2^{1024}$. В показателе 10 бит, значит наибольшее допустимое двоичное число будет $\underbrace {1 \ldots 1} _{10} _2=1023_{10}$. Помимо этого есть мантисса вида $1.\underbrace {1 \ldots 1} _{52} _2$, которую можно округлить до $2_{10}$. Тогда $2 \times 2^{1023} = 2^{1024}$. А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?

Munin в сообщении #1317934 писал(а):
Гуглите "нормализованное число с плавающей запятой (точкой)" и "денормализованное число с плавающей запятой (точкой)".
Точный запрос в гугле "нормализованное число с плавающей" дает 958 результатов. Все они ужасного вида и неинформативны.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:03 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Qlin в сообщении #1317941 писал(а):
Точный запрос в гугле "нормализованное число с плавающей" дает 958 результатов. Все они ужасного вида и неинформативны.
Попытайте счастья с запросами на английском.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:11 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Qlin в сообщении #1317941 писал(а):
Точный запрос в гугле "нормализованное число с плавающей" дает 958 результатов. Все они ужасного вида и неинформативны.

Не знаю, что вам не нравится. Я открыл первые 8 результатов, все они приемлемого вида и информативны:

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:13 
Заслуженный участник


27/04/09
28128
Qlin
Почитайте описание IEEE 754 хоть даже в английской Википедии. Там приведены точные представления всего того, что они предлагают представлять — в том числе вы узнаете, что нулей не один, значений NaN не одно и т. п.. Если гадать, можно не догадаться, например, что единица целой части у нормализованных чисел не хранится* (а у денормализованных она необходимо всё-таки хранится).

* По крайней мере, в форматах binary32 (C float) и binary64 (C double), за которые обычно языки (и аппаратная поддержка, если не трогать расширенную точность) не выходят.

Кстати, заодно стоит знать (хотя к этой теме отношения не имеет), что вычисления с денормализованными числами на многих архитектурах сильно медленнее вычислений с нормализованными, потому их появления во многих приложениях избегают.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:15 
Заслуженный участник
Аватара пользователя


30/01/06
72407
arseniiv в сообщении #1317946 писал(а):
Если гадать, можно не догадаться, например, что единица целой части у нормализованных чисел не хранится

Если гадать, можно не догадаться, что иногда всё-таки хранится.

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:22 
Заслуженный участник


27/04/09
28128
Да, я там добавил, что это касается форматов binary32 и binary64, но необязательно для чего-нибудь другого. Или там ещё какие-то случаи есть?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 68 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group