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
705
Почему разные? Надо учитывать, что диапазон задают четыре числа. Во-первых, это минимальное значение $-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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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