2014 dxdy logo

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

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




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


06/04/18

323
Munin, о чем в этих отрывках идет речь?
arseniiv в сообщении #1317946 писал(а):
единица целой части у нормализованных чисел не хранится* (а у денормализованных она необходимо всё-таки хранится).
Munin в сообщении #1318209 писал(а):
Qlin в сообщении #1318205 писал(а):
Получается, нужно тратить один бит на хранение целой части мантиссы, и на дробную остается 51.
Это верно для денормализованных чисел
Я не понимаю.

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


20/08/14
11785
Россия, Москва
Речь вот про что: денормализованное число $\mathrm{0{,}0001xxxx \cdot 2^{-1022}}$ можно представить в виде $\mathrm{1{,}xxxx \cdot 2^{-1026}}$ с единицей в целой части, но так как такая экспонента не представима в формате double, то тут уже нельзя не хранить старшую $1$, как для нормализованных чисел. Поэтому товарищи и говорят что в денормализованных числах целая часть таки хранится явно (это и есть фактически старшая единица в записи $\mathrm{0{,}0001xxxx}$, хотя $0{,}$ из этой записи конечно всё так же не хранится). И да, на дробную остаётся меньше битов. И чем меньше число, тем меньше битов остаётся. И для числа $2^{-52}\cdot 2^{-1022}=1\cdot 2^{-1074}$ на дробную часть битов не остаётся вообще.

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


06/04/18

323
Dmitriy40 в сообщении #1318259 писал(а):
говорят что в денормализованных числах целая часть таки хранится явно (это и есть фактически старшая единица в записи $\mathrm{0{,}0001xxxx}$
ОК, но это не та целая часть. Это была бы целая часть в нормализованном виде, если бы хватало битов для его хранения.

-- 08.06.2018, 16:28 --

Ладно, вроде с вашей помощью разобрался в теме. Всем спасибо за ссылки и объяснения. Хотелось бы в конце прояснить еще вот какой вопрос: а зачем столько много различных nan'ов и что можно полезного с ними делать?

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


20/08/14
11785
Россия, Москва
Qlin в сообщении #1318274 писал(а):
а зачем столько много различных nan'ов и что можно полезного с ними делать?
Иногда при отладке неудобно вылетать из программы по первой же ошибке, особенно если она возникает спустя часы счёта, хочется проверить максимально далеко/полно. В таких случаях можно вместо ошибки (ошибочного результата операции) вернуть один из NaN и продолжить вычисления. А много их чтобы можно было или счётчик ошибок организовать, или флаги для каждого места в коде (или выполняемого потока) ставить в нём, или какую-то дополнительную информацию сохранить о причине ошибки, и т.д. В принципе это отладочное средство, при нормальной работе они возникать не должны. Как и деление на ноль например.

-- 08.06.2018, 19:58 --

Qlin в сообщении #1318274 писал(а):
ОК, но это не та целая часть. Это была бы целая часть в нормализованном виде, если бы хватало битов для его хранения.
Это в общем вопрос терминологии. У чисел меньше $1\cdot2^0$ целая часть вообще всегда равна нулю, однако в экспоненциальной форме у мантиссы целая часть вполне может (и должна) быть ненулевой. Потому можно считать что старшая ненулевая цифра мантиссы и является целой частью (мантиссы, не числа), в какой бы позиции она не находилась.
Короче не заморачивайтесь Вы этими терминами, считайте что мантисса всегда 53 бита и старший из них не хранится в явном виде и всё. И есть два формата хранения чисел: нормализованный (старший бит равен 1) и денормализованный (старший бит равен 0, а порядок всегда минимально представимый) (плюс конечно ещё нули и бесконечности).

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


27/04/09
28128
Dmitriy40 в сообщении #1318281 писал(а):
А много их чтобы можно было или счётчик ошибок организовать, или флаги для каждого места в коде (или выполняемого потока) ставить в нём, или какую-то дополнительную информацию сохранить о причине ошибки, и т.д.
Интересно. Я думал, просто неудобно было использовать часть значений NaN для чего-то другого (проверки придётся делать более сложные, а и так ведь приходится проверять то и сё, и самих NaN и так два вида), потому оставили всю эту кучу как есть.

Поискал, ничего нового не нашёл:
https://stackoverflow.com/questions/19800415/why-does-ieee-754-reserve-so-many-nan-values

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


01/09/13
4656

(Оффтоп)

arseniiv в сообщении #1318294 писал(а):
Я думал, просто неудобно было использовать часть значений NaN для чего-то другого

Я тоже так думаю, но это не повод что бы не использовать это для "своих нужд" :-)

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


20/08/14
11785
Россия, Москва
Наткнулся на тему и решил дополнить.
arseniiv в сообщении #1318294 писал(а):
Интересно. Я думал, просто неудобно было использовать часть значений NaN для чего-то другого
Я уже не помню где это впервые прочитал, про использование NaN для нужд отладки, но как аргумент к своим словам приведу что NaN-ы разделяются на два класса SNaN и QNaN, зачем нужны первые я не очень понимаю (разве только тестировать реакцию программы на NaN на входе или вылетать при чтении неинициализированных плавающих переменных, причём компилятор может даже закодировать в самом NaN где и каких), но для обоих типов прописано специальное правило, что если их встречается два одного типа в операции, то на выход выдаётся не абы какое, а обязательно с большим значением мантиссы. И это повелось аж с самого первого x87, правда на нём и заглохло, в SSE не попало и потому вряд ли используется современными компиляторами. Т.е.,Geen, добавление функционала (различия SNaN и QNaN и сравнения мантисс) никак нельзя назвать "забыли/упростили и потому мы можем использовать для себя", это наоборот специально задумали и сделали (но видимо мало кому пригодилось). Сейчас эту инфу можно найти в Table 4-7. Rules for Handling NaNs раздела 4.8.3.5 Operating on SNaNs and QNaNs документа Intel 64-ia-32-architectures-software-developer-manual (20мег). Приведу выдержку из следующего пункта оттуда же о примерах использования:
Цитата:
For example, a compiler can use signaling NaNs as references to uninitialized (real) array elements. The compiler can preinitialize each array element with a signaling NaN whose significand contained the index (relative position) of the element. Then, if an application program attempts to access an element that it had not initialized, it can use the NaN placed there by the compiler. If the invalid operation exception is unmasked, an interrupt will occur, and the exception handler will be invoked. The exception handler can determine which element has been accessed, since the operand address field of the exception pointer will point to the NaN, and the NaN will contain the index number of the array element.

Quiet NaNs are often used to speed up debugging. In its early testing phase, a program often contains multiple errors. An exception handler can be written to save diagnostic information in memory whenever it was invoked. After storing the diagnostic data, it can supply a quiet NaN as the result of the erroneous instruction, and that NaN can point to its associated diagnostic area in memory. The program will then continue, creating a different NaN for each error. When the program ends, the NaN results can be used to access the diagnostic data saved at the time the errors occurred. Many errors can thus be diagnosed and corrected in one test run.

In embedded applications that use computed results in further computations, an undetected QNaN can invalidate all subsequent results. Such applications should therefore periodically check for QNaNs and provide a recovery mechanism to be used if a QNaN result is detected.

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


09/05/16
138
Например, язык R использует определённый payload внутри NaN для того, чтобы представлять специальное значение NA, которое значит не ошибку в вычислениях с плавающей запятой, а отсутствующее значение. Например, предполагается, что если имеется таблица с результатами экспериментов, выполняемых каждый день, но несколько раз прибор был сломан, в эти места нужно подставить NA.

(Оффтоп)

А ещё некоторые математики предлагают новый тип данных под названием Posit, который обладает некоторыми интересными свойствами, но без поддержки его в "железе", понятное дело, им особенно не воспользуешься.

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

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



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

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


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

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