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
12125
Россия, Москва
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
4816
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
12125
Россия, Москва
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
12125
Россия, Москва
Лично мне было проще понять денормализованные числа как $\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, Супермодераторы



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

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


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

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