2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5  След.
 
 Re: Тип double в C++
Сообщение07.06.2018, 22:40 
Заслуженный участник


20/08/14
11002
Россия, Москва
Munin в сообщении #1318035 писал(а):
С такими заявлениями в машинной арифметике осторожней надо...
Согласен, выражение не слишком аккуратное. Хотя придумать контрпример навскидку и не могу (не побитовой разницы, тут ведь речь не о ней идёт, а именно в смысле два числа с нулевым расстоянием не равны друг другу, т.е. в машинной арифметике выполняются одновременно оба условия $x \ne y$ и $|x-y|=0$). Не было бы денормализованных чисел - пример бы нетруден, разность двух близких к наименьшим представимым чисел, но вот с денормализованными такой финт не проходит. Может знаете пример? Мне уже интересно.

realeugene в сообщении #1318045 писал(а):
Примеры с представлением целых чисел не имеют отношения к представлениям плавающих чисел.
Вообще-то имеют: плавающее число это целое (мантисса) домноженное на основание в степени порядка, $\pm a \cdot b^c$. Что мантисса представляется в формате с фиксированной точкой (который в свою очередь строится из целых чисел и степеней основания) - уже детали, можно порядок сместить и представлять мантиссу исключительно целой, в прямом коде (если речь про IEEE 754). Впрочем это прямого отношения уже не имеет.
realeugene в сообщении #1318045 писал(а):
Так что, я вынужден согласиться,
Ок, на этом надеюсь и закончим эту ветвь обсуждения. :-)

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


01/09/13
4317
Dmitriy40 в сообщении #1318058 писал(а):
плавающее число это целое (мантисса) домноженное на основание в степени порядка

А куда пропали бесконечности и NaN'ы??

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


27/04/09
28128
В общем, как можно видеть, даже благонамеренные объяснения стандарта в обход самого стандарта утыкаются в требование показать стандарт. :D Хорошо, что я вовремя убежал свалил стал заниматься другими вещами.

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


30/01/06
72407
Dmitriy40 в сообщении #1318058 писал(а):
Может знаете пример?

Нет, конкретно на ваше утверждение - нет. Но просто хотелось бы видеть его как-то обоснованным именно в свете машинной арифметики, а не математической.

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


20/08/14
11002
Россия, Москва
Geen в сообщении #1318070 писал(а):
А куда пропали бесконечности и NaN'ы??
К делу не относятся, я ж не собирался описывать все возможные объекты стандарта IEEE 754.

-- 07.06.2018, 23:54 --

Munin
Не знаю стоит ли продолжать, на что я возражал (возможно не слишком аккуратно) пришли к соглашению. Доводить возражения до большей аккуратности ... Цель то достигнута. ;-)

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение08.06.2018, 08:46 


06/04/18

323
Вот что я понял (не уверен, что понял правильно). Показатель занимает все 11 бит; он хранится без знака в смещенном виде. Возможные значения показателя нормализованных чисел находятся в реальном диапазоне от −1022 +1023, и представлены от 1 до 2046. Нулевой показатель $\underbrace {0 \ldots 0} _{11} _2$ зарезервирован для денормализованных чисел и нулей.

Теперь можно подсчитать ближайшее к нулю положительное денормализованное число. Нужно мантиссу $0.\underbrace {0 \ldots 0} _{51}1 _2=2^{-52}_{10}$ умножить на степень двойки с зарезервированным значением показателя $-1023$. Получится $2^{-52} \times 2^{-1023}$. Как вы можете видеть, Dmittiy40, это на порядок меньше того числа, которое вы признаете ближайшим. Если же взять незарезервированный наименьший показатель, то им будет $-1022$, но тогда подразумевается, что мантисса начинается с единицы а не с нуля. Ближайшее к нулю положительное нормализованное число равняется $1 \times 2^{-1022}$.
arseniiv в сообщении #1317946 писал(а):
Qlin
Почитайте описание IEEE 754 хоть даже в английской Википедии. Там приведены точные представления всего того, что они предлагают представлять — в том числе вы узнаете, что нулей не один, значений NaN не одно и т. п.. Если гадать, можно не догадаться, например, что единица целой части у нормализованных чисел не хранится* (а у денормализованных она необходимо всё-таки хранится).
То есть как это у денормализованных хранится единица целой части? Вы подразумеваете, что для них зарезервировано специальное значение показателя, при котором целая часть мантиссы обнуляется? И пожалуйста, если не затруднит, укажите место, где об этом хранении написано в рекомендованной статье: https://en.wikipedia.org/wiki/IEEE_754

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


30/01/06
72407
Qlin в сообщении #1318140 писал(а):
Теперь можно подсчитать ближайшее к нулю положительное денормализованное число. Нужно мантиссу $0.\underbrace {0 \ldots 0} _{51}1 _2=2^{-52}_{10}$ умножить на степень двойки с зарезервированным значением показателя $-1023$.

А вы уверены, что зарезервированное значение показателя - именно $-1023$?
Изображается оно всеми нулями в битах показателя, но вот какое при этом подразумевается значение?

Qlin в сообщении #1318140 писал(а):
То есть как это у денормализованных хранится единица целой части?

Надо же как-то определить, где мантисса начинается, если число денормализовано (для нормализованного с этим проблем нет).

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


11/06/12
10390
стихия.вздох.мюсли

(Оффтоп)

как трудно жить среди занудов
сказал трёхлетний николай
среди зануд поправил павел
тридцатилетний и в очках

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение08.06.2018, 13:45 


06/04/18

323
Получается, нужно тратить один бит на хранение целой части мантиссы, и на дробную остается 51.

Munin в сообщении #1318170 писал(а):
Изображается оно всеми нулями в битах показателя, но вот какое при этом подразумевается значение?
Думаю, значение должно быть такое же минус смещение, а смещение 1023. Нет?

Если всё это было бы верно, то получилось бы $2^{-51} \times 2^{-1023}$, но в Википедии указано $2^{-52} \times 2^{-1022}$. Короче, я точно что-то недопонял, или мне недоподсказали.

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


30/01/06
72407
Qlin в сообщении #1318205 писал(а):
Получается, нужно тратить один бит на хранение целой части мантиссы, и на дробную остается 51.

Это верно для денормализованных чисел, а для нормализованных - неверно (но в 80-битном формате Intel x86 - верно для любых чисел; он изначально задумывался как внутренний формат математического сопроцессора, и цель экономии битов не ставилась).

Qlin в сообщении #1318205 писал(а):
Думаю, значение должно быть такое же минус смещение, а смещение 1023. Нет?

Если принять такое решение, то между нормализованными и денормализованными числами возникает неоправданный разрыв: нельзя представить число $0{,}1_2\times 2^{-1022}.$

-- 08.06.2018 14:00:31 --

Qlin в сообщении #1318205 писал(а):
Если всё это было бы верно, то получилось бы $2^{-51} \times 2^{-1023}$, но в Википедии указано $2^{-52} \times 2^{-1022}$.

Внимательнее: $2^{-51}\times 2^{-1023}=2^{-52}\times 2^{-1022}.$

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


06/04/18

323
Тогда должно быть значение $-1022$.

Munin в сообщении #1318209 писал(а):
Это верно для денормализованных чисел
А почему? Я эту фразу "определить, где мантисса начинается" понять не могу. Вот есть какое-то двоичное число длины 52 (которое может начинаться с нулей). Что мешает приписать к нему слева $0.$ ?

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


20/08/14
11002
Россия, Москва
Лично мне было проще понять денормализованные числа как $\mathrm{0{,}xxx \ldots xx_2\cdot 2^{-1022}}$ - т.е. с фиксированной точкой, нулевой целой частью, и домноженные на фиксированную экспоненту. И нулевое значение битов экспоненты - просто признак (флаг) нуля слева от запятой и экспоненты ровно $-1022$. Оба следствия вполне логичны если рассмотреть уменьшение представимых чисел на минимально возможный шаг.

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


30/01/06
72407
Qlin в сообщении #1318214 писал(а):
Вот есть какое-то двоичное число длины 52 (которое может начинаться с нулей). Что мешает приписать к нему слева $0.$ ?

У денормализованных приписывается $0{,}$
У нормализованных приписывается $1{,}$

 Профиль  
                  
 
 Re: Тип double в C++
Сообщение08.06.2018, 14:32 


06/04/18

323
Munin, зачем хранить целую часть?

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


30/01/06
72407
Вот она и не хранится, чёрт побери!!!

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

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



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

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


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

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