2014 dxdy logo

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

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




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


20/08/14
5591
Россия, Москва
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Потому что порядок минимальный и мантисса минимальная из возможных ненулевых.

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


06/04/18
228
Dmitriy40 в сообщении #1317951 писал(а):
мантисса минимальная из возможных ненулевых.
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Dmitriy40 в сообщении #1317951 писал(а):
порядок минимальный
Я уже посчитал, что порядок минимальный — это как максимальный (число 1023), только брать надо с противоположным знаком. В чем ошибка? Под знак отводится отдельный бит. Ошибки быть не должно.

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


27/04/09
24456
Уфа
Qlin в сообщении #1317957 писал(а):
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Во-первых, какая разница, как принято где-то там, для формата машинного представления чисел. Во-вторых посмотрите же IEEE 754.

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


06/04/18
228
Ушёл читать всё, что мне рекомендовано.

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


20/08/14
5591
Россия, Москва
Qlin в сообщении #1317957 писал(а):
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Посмотрите наконец формат представления денормализованных чисел. Чего гадать-то?!

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


27/08/16
5107
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Наименьшее положительное - это $+0$. Есть ещё и $-0$. :mrgreen:

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


27/04/09
24456
Уфа
Нули не считаются положительными/отрицательными и даже равны друг другу. Чтобы узнать знак нуля, надо исхитриться.

-- Чт июн 07, 2018 21:00:20 --

Ещё полезное чтение: (Google) what every computer scientist should know about floating-point arithmetic, тут можно открыть страницу от Oracle, а лучше, наверное, скачать PDF; это глава из какой-то книги, получившая распространение сама по себе.

UPD. Вот ещё полезный сайтик: http://floating-point-gui.de/.

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


30/01/06
68751
arseniiv в сообщении #1317950 писал(а):
Или там ещё какие-то случаи есть?

Afaik, нет.

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


04/05/09
4458
realeugene в сообщении #1317962 писал(а):
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Наименьшее положительное - это $+0$. Есть ещё и $-0$. :mrgreen:

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <iostream>
int main()
{
    double x1 = +0.0;
    double x2 = -0.0;
    if ( x1 > 0 )
        std::cout << x1 << " is positive" << std::endl;
    else
        std::cout << x1 << " is not positive" << std::endl;
    if ( x1 < 0 )
        std::cout << x1 << " is negative" << std::endl;
    else
        std::cout << x1 << " is not negative" << std::endl;
    if ( x1 == 0 )
        std::cout << x1 << " is zero" << std::endl;
    else
        std::cout << x1 << " is not zero" << std::endl;
    if ( x2 > 0 )
        std::cout << x2 << " is positive" << std::endl;
    else
        std::cout << x2 << " is not positive" << std::endl;
    if ( x2 < 0 )
        std::cout << x2 << " is negative" << std::endl;
    else
        std::cout << x2 << " is not negative" << std::endl;
    if ( x2 == 0 )
        std::cout << x2 << " is zero" << std::endl;
    else
        std::cout << x2 << " is not zero" << std::endl;
}
 

0 is not positive
0 is not negative
0 is zero
-0 is not positive
-0 is not negative
-0 is zero

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


20/08/14
5591
Россия, Москва
realeugene в сообщении #1317962 писал(а):
Наименьшее положительное - это $+0$.
Это неправда, для него не выполняется требование положительности: $+0 \not > 0$. Как и для $-0$ требование отрицательности.
Более того, $+0=0=-0$. Ни один из $\pm0$ ни меньше нуля, ни больше. Только что проверил:
Используется синтаксис Delphi
{$APPTYPE CONSOLE}
var     a, b: double;
begin
        a := -0.0; b := +0.0;
        Writeln(a); Writeln(b);
        Writeln(a < b, ',', a = b, ',', a > b);
        Writeln(a < 0, ',', a = 0, ',', a > 0);
        Writeln(b < 0, ',', b = 0, ',', b > 0);
end.
Используется синтаксис Text
-0.00000000000000E+0000
 0.00000000000000E+0000
FALSE,TRUE,FALSE
FALSE,TRUE,FALSE
FALSE,TRUE,FALSE

UPD. О, а вот и для С проверку выложили.

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


27/04/09
24456
Уфа
Munin
Ну вот, напугали. Думаю, про 80-битный расширенный формат в этой теме говорить не обязательно, он ещё ведь и не во всех процессорах наверняка доступен для манипуляций (когда доступны binary32 и binary64).

-- Чт июн 07, 2018 21:15:19 --

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

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


27/08/16
5107
Munin в сообщении #1317970 писал(а):
Afaik, нет.
80-битный long double разве не стандартизован как расширенный плавающий тип?

arseniiv в сообщении #1317966 писал(а):
Нули не считаются положительными/отрицательными и даже равны друг другу. Чтобы узнать знак нуля, надо исхитриться.
Равны, но python знак печатает. Как и C и Pascal.

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


20/08/14
5591
Россия, Москва
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?
Нет, от него всё же отказались в пользу 16-ти и 32-х байтовых форматов. Если речь про стандарт IEEE 754 ("The standard does not require an implementation to support extended or extendable precision formats.").

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


27/04/09
24456
Уфа
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?
Как the расширенный нет. Как один из возможных расширенных binary64 да, и это наименьший возможный: https://en.wikipedia.org/wiki/IEEE_754#Extended_and_extendable_precision_formats. Реализация не обязана поддерживать расширенные форматы (см. всё там же).

realeugene в сообщении #1317978 писал(а):
Равны, но python знак печатает.
Не читал сам стандарт, но кажется он и не должен запрещать им иметь разные строковые представления. Тут надо ещё напомнить, что он определяет не одно отношение порядка (это точно знаю) и, кажется, не одно отношение равенства, хотя высокоуровневые языки обычно не дают доступа ко всей этой красоте.

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


30/01/06
68751
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?

Ни в коем случае. Он допустим, как расширенный плавающий тип, но не стандартизован. (На расширенные только наложены некоторые требования, которым 80-битный удовлетворяет.)

Более того, 80-битные поддерживаются только архитектурами Intel (я бы даже сказал, только x86, но не уверен насчёт IA-64). Остальные производители предпочитают 128-битный long double, как раз стандартизованный IEEE 754. Более того, IEEE 754-2008 (ныне действующий) стандартизует также и 256-битный формат.

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

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



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

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


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

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